【问题标题】:Rails routes, kind of synonym routesRails 路线,一种同义词路线
【发布时间】:2012-07-21 06:42:48
【问题描述】:

声明

假设我们有一个库存应用程序,它有一个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指定而不是create .

问题

  1. 我应该如何为purchase 的添加restful 路由?负责指定 HTTP 方法,例如 GETPOSTPUTDELETE 等。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    你可以提到其他的,比如删除,输入:via

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

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

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

    【讨论】:

    • 我在帖子中添加了第二个问题。
    • 使用 :via 选项对于指定 HTTP 方法很有用。
    • 希望更新后的答案能解决您的第二个问题。尝试先用谷歌搜索你的问题。如果你在谷歌上找不到答案,你可以在这里发帖:)
    【解决方案2】:

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

    或者,您可以假设它们是同一个对象,并使用有意义的语义路径以相同的方式处理它们。也就是说,您正在寻找的可能是 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_for 辅助方法仍然可以像往常一样使用。假设 @movement 被正确定义,带有 purchases 根的路径将被正确调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      相关资源
      最近更新 更多