rails中path、url路径解析,routes信息,form_for剖析,link_to示例,路由实例说明

原创,转载请注明http://www.cnblogs.com/juandx/p/3963023.html

 rails中path、url路径解析,routes信息,form_for剖析,link_to示例

1、首先要了解routes中resources的member、collection、new的关系 =>

     http://www.cnblogs.com/juandx/articles/3962694.html

 

2、然后在cmd中rake routes要看懂

C:\Users\Administrator\Desktop\lianxizhong\lianxi1_form_for\depot>bundle exec ra
ke routes
  orders_index GET    /orders/index(.:format)     orders#index
   xshow_order GET    /orders/:id/xshow(.:format) orders#xshow
xcreate_orders POST   /orders/xcreate(.:format)   orders#xcreate
        orders GET    /orders(.:format)           orders#index
               POST   /orders(.:format)           orders#create
     new_order GET    /orders/new(.:format)       orders#new
    edit_order GET    /orders/:id/edit(.:format)  orders#edit
         order GET    /orders/:id(.:format)       orders#show
               PUT    /orders/:id(.:format)       orders#update
               DELETE /orders/:id(.:format)       orders#destroy

  第一列指路径名称,比如第二个xshow_order   这样就可以引用xshow_order_path 和 xshow_order_url 了,不然当你随便乱用_path和_url的时候就会提示

                       undefined local variable or method `xcreate_orderss_path' for #<#<Class:0x42d8600>:0x3791190>

第二列是对应的http verb选项

第三列是对应路径

第四列是对应控制器和其中的方法,比如orders#xshow中就是这个路径要对应到orderscontroller 中的 xshow方法

 

3、实例解释
     

    先看一下代码

  orderscontroller.rb

class OrdersController < ApplicationController
  def index
    flash.now[:notice] = 'Message sent!'
    @order = Order.all
  end

  def new
	@order12 = Order.new
  end

  def create
    flash.now[:notice] = "bb"
    @order = Order.new(params[:order])
    if @order.save
	  flash[:notice] = "yes"
	  redirect_to :action => 'index'
	else
	  flash.now[:alert] = "no"
	end
  end

  def xcreate
    flash.now[:notice] = "bb"
    @order = Order.new(params[:order])
    if @order.save
	  flash[:notice] = "yes"
	  redirect_to :action => 'index'
	else
	  flash.now[:alert] = "no"
	end
  end

  def show
	@order = Order.find(params[:id])
  end

  def xshow
	@order = Order.find(params[:id])
  end

end

  

 

  routes.rb

  

Depot::Application.routes.draw do
  get "orders/index"

  resources :orders do 
    get 'xshow', on: :member
    post 'xcreate', on: :collection
  end


end

  

 

  index.html.erb

<h1>hello,rails </h1>

<% @order.each do |oo| %>
  <div>
    <%= oo.name %>   <%= link_to 'see', xshow_order_path(oo) %><br/>
    <%= sanitize(oo.des) %>
  </div>
	
<% end %>

<br/>
<br/>

<%= link_to "create" , new_order_path  %>

  

  new.html.erb

  

<%= form_for @order12 , url: xcreate_orderss_path do |f| %>
	<div>
	  <%= f.label "Name is" %><br />
	  <%= f.text_field :name, :size => 40 %>
	</div>
	<div>
	  <%= f.label :Description %><br />
	  <%= f.text_area :des, :rows => 3, :cols => 40 %>
	</div>
	<div>
	  <%= f.submit 'Place Order' %>
	</div>
<% end %>

  

  show.html.erb

  

<p>
  <b>Name:</b>
  <%=h @order.name %>
</p>

<p>
  <b>Description:</b>
  <%= @order.des %>
</p>

<%= link_to 'Back', orders_path %>

  

   好了,最后的show和xshow是一样的,create和xcreate是一样的,目的就是想学习下路由而已

  

  注意了,

  (1)、先看看form_for的构造吧:

        在controller中new方法中@order12 = Order.new,这样就会把一个实例传给new.html.erb中的那个表单,这样表单就能根据@order12中的属性来构造:

    比如<%= f.text_field :name, :size => 40 %>中的name就是@order12中的name属性,必须一一对应。

        然后在表单中填完数据后要发送给一个地址,然后执行post请求,所以在表单第一行就写好了<%= form_for @order12 , url: xcreate_orders_path do |f| %>

    说明写完数据后,最后submit是到xcreate_order_path的路径,看看那个cmd中的路由就知道是到了orderscontroller中的xcreate方法。所以如果不用path写法也可以直接写成

    <%= form_for @order12 , url: {:action => "xcreate"} do |f| %>。这样之后就可以直接让xcreate中执行post请求了(就是 @order.save)。在controller中的xcreate方法中        的@order = Order.new(params[:order]),就是因为new.html.erb中最后submit后的是一个params[:order],而不是刚刚的@order12了,这里写成不同就是为了区别。

        其实默认的是new.html.erb之后直接对应到controller中的create,后台代码我还没读,但是,默认的url是到create的,所以你什么都不写的话,如<%= form_for @order12 do |f|     %>,然后在controller中的create中用 @order.save就可以保存信息到数据库里了,所以我这里为了验证就新建了一个xcreate方法了。

 

  (2)、link_to

         在index.html.erb中,可以看到<%= oo.name %>&nbsp;&nbsp;&nbsp;<%= link_to 'see', xshow_order_path(oo) %><br/>,这样就建了一个连接,因为在routes中用       的是member方法,所以这样就可以传递参数进去了。当然,如果什么path都不写,一开始的话是默认到show的。。。这应该也是rails后台默认的吧。。。所以在web敏捷开发里就是这       样<%= oo.name %>&nbsp;&nbsp;&nbsp;<%= link_to 'show', oo %><br/>了。。。

         当然不用path写法也可以直接写,但是要对应好rake routes中的路由路径信息  比如路径信息是   xshow_order GET    /orders/:id/xshow(.:format) orders#xshow,那么就要       这样写:<%= link_to 'see', {:controller => "orders",:id => oo, :action => "xshow"} %>

    

 4、对routes中的resources写法补充

      

Example::Application.routes.draw do

  resources :vmc_vstores

  resources :vdisks do
    get 'download', on: :member
  end

  resources :vstores do
    member do
      get 'volumn_vdisk_info'
      post 'do_unmount_cdrom_vdisk'
    end
    get 'topo', on: :collection
  end

  namespace :admins do
    resources :users do
      get 'lock', on: :member
      get 'unlock', on: :member
    end

    resources :roles


  match ':controller(/:action(/:id))(.:format)'
end

  

使用HTML Form以及Railsform_for和form_tag可以方便地创建表单,其包括多选下拉框。下面是一些使用技巧: 1. 使用form_for创建表单: ``` <%= form_for @model do |f| %> <%= f.select :attribute, options_for_select([["Option 1", 1], ["Option 2", 2], ["Option 3", 3]], @model.attribute), {}, multiple: true %> <%= f.submit "Submit" %> <% end %> ``` 其,options_for_select可以为选项提供一个数组,第一个元素是选项的标签,第二个元素是选项的值。在这个例子,我们创建了一个多选下拉框,它会将选的值存储在@model.attribute。 2. 使用form_tag创建表单: ``` <%= form_tag some_path do %> <%= select_tag :attribute, options_for_select([["Option 1", 1], ["Option 2", 2], ["Option 3", 3]], params[:attribute]), {}, multiple: true %> <%= submit_tag "Submit" %> <% end %> ``` 这个例子,我们使用form_tag创建表单,并创建了一个多选下拉框,它会将选的值存储在params[:attribute]。 3. 使用select2插件: select2是一个快速创建具有搜索功能的下拉框的jQuery插件。要使用它,首先需要将它添加到项目: ``` # application.js //= require select2 # application.css *= require select2 *= require select2-bootstrap ``` 然后,可以使用下面的代码创建select2下拉框: ``` <%= f.select :attribute, options_for_select([["Option 1", 1], ["Option 2", 2], ["Option 3", 3]], @model.attribute), {}, multiple: true, class: "select2" %> <script> $(document).ready(function() { $('.select2').select2(); }); </script> ``` 在这个例子,我们将select2应用于多选下拉框,它会在下拉菜单添加搜索框,并使用户能够更容易地查找选项。 希望这些技巧对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值