声明
想象一下,我们有一个库存应用程序,它是一个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"}
如果您可以看到purchase
与movement
的模型相同,则实际上由MovementsController
处理,但有不同的流量和处理方式,由{create_purchase
指定1}}而不是create
。
问题
我应该如何为purchase
添加休息路线?注意指定GET
,POST
,PUT
,DELETE
等HTTP方法
我应该如何撰写form_for
代码?使用movement
模型我们可以写:<%= form_for(@movement) do |f| %>
但是如何调用purchase
或create
方法的update
路径?
我应该如何为purchase
指定验证规则?我在Movement
模型上指定了一些规则,但在提交表单时它们不适用于purchase
。
答案 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
根的路径。