Rails路由,同义词路由

时间:2012-07-23 02:00:03

标签: ruby-on-rails-3 rest routes

声明

想象一下,我们有一个库存应用程序,它是一个Movement模型,它代表任何产品购买或产品销售的动作。所以我们有默认的REST路由。

    movements GET    /movements(.:format)          {:action=>"index", :controller=>"movements"}
              POST   /movements(.:format)          {:action=>"create", :controller=>"movements"}
 new_movement GET    /movements/new(.:format)      {:action=>"new", :controller=>"movements"}
edit_movement GET    /movements/:id/edit(.:format) {:action=>"edit", :controller=>"movements"}
     movement GET    /movements/:id(.:format)      {:action=>"show", :controller=>"movements"}
              PUT    /movements/:id(.:format)      {:action=>"update", :controller=>"movements"}
              DELETE /movements/:id(.:format)      {:action=>"destroy", :controller=>"movements"}

对于助记建议,我们希望有一些描述性路线,例如:

 new_purchase        /purchase/new(.:format)       {:controller=>"movements", :action=>"new_purchase"}
edit_purchase        /purchase/:id/edit(.:format)  {:controller=>"movements", :action=>"edit_purchase"}

如果您可以看到purchasemovement的模型相同,则实际上由MovementsController处理,但有不同的流量和处理方式,由{create_purchase指定1}}而不是create

问题

  1. 我应该如何为purchase添加休息路线?注意指定GETPOSTPUTDELETE等HTTP方法

  2. 我应该如何撰写form_for代码?使用movement模型我们可以写:<%= form_for(@movement) do |f| %>但是如何调用purchasecreate方法的update路径?

  3. 我应该如何为purchase指定验证规则?我在Movement模型上指定了一些规则,但在提交表单时它们不适用于purchase

2 个答案:

答案 0 :(得分:1)

您可以在路线文件中使用这样的东西

 match '/purchase/new(.:format)' => 'movements#new_purchase'     :via => :get
 match '/purchase/:id/edit(.:format)' => 'movements#edit_purchase' :via => :post 

你可以提及其他像删除,放入:通过

有关详细信息,请查看此link  如果要将create更改为create_purchases,请转到移动控制器并更改定义名称。

对于第二个问题,你可以做这样的事情

form_tag(:controller => "controller_name", :action => "action_name", :method => "get")

答案 1 :(得分:1)

我认为您不应该寻找一种方法来为一个以两种不同方式处理对象的模型RESTful构建路由。这听起来像你真的在寻找两个物体。您可以创建一个Purchase模型,该模型从父Movement模型继承其属性。

或者,您可以假设它们是同一个对象,并使用有意义的语义路径以相同的方式处理它们。也就是说,您正在寻找的可能是Movement控制器操作的默认RESTful路由的路径更改。此外,典型的rails约定是使用多个路径路径,这使得索引页面具有语义意义,并​​且识别作为数据库中对象表的子集的对象,因此我使用purchases而不是{{ 1}}。

purchase

将产生

resources :movements, :path => "/purchases"

使用此模型,仍可以像平常一样使用 movements GET /purchases(.:format) {:action=>"index", :controller=>"movements"} POST /purchases(.:format) {:action=>"create", :controller=>"movements"} new_movement GET /purchases/new(.:format) {:action=>"new", :controller=>"movements"} edit_movement GET /purchases/:id/edit(.:format) {:action=>"edit", :controller=>"movements"} movement GET /purchases/:id(.:format) {:action=>"show", :controller=>"movements"} PUT /purchases/:id(.:format) {:action=>"update", :controller=>"movements"} DELETE /purchases/:id(.:format) {:action=>"destroy", :controller=>"movements"} 辅助方法。假设form_for已正确定义,将正确调用@movement根的路径。