0

假设我有一个收据模型,并且我想提供一个控制器操作来打印一个...不放心的方法是:

# 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 create ... end end

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

收据_printings_path(123) 获取/receipts/123/printings

我知道如何做到这一点的唯一方法是:

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

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

4

3 回答 3

0

您可以使用嵌套路由,但我阅读您的问题的方式听起来像是您想要命名空间。命名空间可能如下所示:

resources :receipts
namespace :receipts do
  resources :printings
end

这会将 /receipts/printings/:id 路由到 app/receipt/printings_controller.rb 并带有用于打印的 id(不是收据)。

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

resources :receipts do
  resource :printing
end

如图所示,这会将 /receipts/:id/print 路由到 app/printings_controller.rb。

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

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

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

于 2012-05-07T10:39:18.053 回答
0

如果我是对的,你需要一个嵌套资源,看看这个rails 指南

于 2012-05-07T07:21:17.150 回答
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)

我希望它有帮助

于 2012-05-07T08:24:15.987 回答