zoukankan      html  css  js  c++  java
  • 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:UsersAdministratorDesktoplianxizhonglianxi1_form_fordepot>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
    

      

  • 相关阅读:
    菜根谭#298
    菜根谭#297
    菜根谭#296
    菜根谭#295
    菜根谭#294
    菜根谭#293
    菜根谭#292
    菜根谭#291
    菜根谭#290
    菜根谭#289
  • 原文地址:https://www.cnblogs.com/juandx/p/3963023.html
Copyright © 2011-2022 走看看