1

陈述

想象一下,我们有一个库存应用程序,它有一个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's 和 's 是同一个型号movement,实际上是由 处理的MovementsController,但是有不同的流程和处理,这个由create_purchase而不是指定create

问题

  1. purchase我应该如何为's添加宁静的路线?照顾指定的 HTTP 方法,如GET, POST, PUT,DELETE等。

  2. 我应该如何写form_for标签?使用movement模型我们可以写:<%= form_for(@movement) do |f| %>但是如何为或方法调用purchase路径?createupdate

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

4

2 回答 2

1

你可以在你的路由文件中使用这样的东西

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

您可以提及其他人,例如删除,输入:via

有关更多信息,请查看此链接 如果您想将 create 更改为 create_purchases,请转到移动控制器并更改定义名称。

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

form_tag(:controller => "controller_name", :action => "action_name", :method => "get")
于 2012-07-23T02:08:25.913 回答
1

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

或者,您可以假设它们是同一个对象,并使用有意义的语义路径以相同的方式处理它们。也就是说,您正在寻找的可能是Movement控制器操作的默认 RESTful 路由的路径更改。此外,典型的 rails 约定是使用多个路径路由,这对于索引页面和识别作为数据库中对象表子集的对象具有语义意义,因此我使用purchases而不是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_forhelper 方法仍然可以像往常一样使用。假设@movement被正确定义,带有purchases根的路径将被正确调用。

于 2012-07-23T04:21:22.217 回答