通过命名空间进行restful路由的正确约定是什么?

时间:2012-05-07 07:06:04

标签: ruby-on-rails ruby-on-rails-3 rails-routing

假设我有一个收据模型,我想提供一个控制器动作来打印一个......不安全的方式是:

# receipt_controller.rb
  def print
    ...
  end

#routes.rb
  resources :receipts do
    get :print, :on => :member
  end

......安静的方式是:

# receipt_printings_controller.rb
  def create
    ...
  end

#routes.rb
  resources :receipts
  resources :receipt_printings, :only => :create

我的问题是......假设我想拥有以下结构:

/app
  /controllers
     receipts_controller.rb
     /receipt
       printings_controller.rb

这意味着我的课程看起来像:     class Receipt :: PrintingsController<的ActiveRecord :: Base的       def创建         ...       结束     端

但是我不知道如何在这种情况下正确路由,因为我仍然需要能够做到:

receipt_printings_path(123)获取/收据/ 123 /打印

我知道如何实现这一目标的唯一方法是:

#routes.rb
  match "/receipts/:id/printings" => "receipt/printings#create", :as => :receipt_printings
  resources :receipts

但是,我想知道是否有更好的方式?

3 个答案:

答案 0 :(得分:0)

如果我是对的,你需要一个嵌套资源,请查看rails guide

答案 1 :(得分:0)

我认为你可以这样做:

resources :receipts do 
  resources :printings, :controller => "receipt/printings", :only => :create
end

它将生成:

receipt_printings POST /receipts/:receipt_id/printings(.:format) receipt/printings#create

然后访问您的路线:

receipt_printings_path(:receipt_id => @receipt.id)

我希望它有所帮助

答案 2 :(得分:0)

你可以使用嵌套路由,但我读到你的问题的方式对我来说就像你想要名称空间一样。命名空间可能如下所示:

resources :receipts
namespace :receipts do
  resources :printings
end

这会路由/收据/打印/:id到app / receipt / printings_controller.rb,并带有打印ID(不是收据)。

您可能真的想要嵌套路由。如果您想使用收据ID,并且只有一个打印操作(每个收据),您可以使用单一资源。

resources :receipts do
  resource :printing
end

这会路由/收据/:id / print到app / printings_controller.rb如图所示。

要在命名空间中组织打印控制器,我会将其留在路由之外,因为这会尝试在URL中插入另一个收据命名空间。相反,使用,

resources :receipts do
  resource :printing, :controller => "receipt/printings"
end

这是如何成为RESTful的。但是,您可能没有RESTful案例。印刷真的在创造吗?它真的在做秀或更新吗?如果它是一个不适合CRUD操作的服务,那么是时候偏离黄金路径了,继续使用非RESTful动词。