假设我有一个收据模型,我想提供一个控制器动作来打印一个......不安全的方式是:
# 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
但是,我想知道是否有更好的方式?
答案 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动词。