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

しかし、私はまだできる必要があるので、このコンテキストで適切にルーティングする方法がわかりません。

/ receive_printings_path(123)を取得して/ receiveipts / 123/printingsを取得します

これを達成する方法を私が知っている唯一の方法は、次のことを行うことです。

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

しかし、もっと良い方法があるのだろうか?

4

3 に答える 3

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 に答える
0

ネストルートを使用することもできますが、私があなたの質問を読むと、名前空間が必要なように聞こえます。名前空間は次のようになります。

resources :receipts
namespace :receipts do
  resources :printings
end

これにより、/ receipts / Printings /:idが、印刷用のID(領収書ではない)を使用してapp / receipt/printings_controller.rbにルーティングされます。

ネストされたルートが本当に必要になる場合があります。レシートIDを使用し、(レシートごとに)印刷アクションが1つしかない場合は、単一のリソースを使用できます。

resources :receipts do
  resource :printing
end

これにより、/ receipts /:id/printがshowのようにapp/printings_controller.rbにルーティングされます。

印刷コントローラーを名前空間に整理するには、URLに別のレシート名前空間を挿入しようとするため、ルートから除外します。代わりに、

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

これがRESTfulになる方法です。ただし、RESTfulケースがない場合があります。印刷は本当に作成を行っていますか?それは本当にショーやアップデートをしているのですか?CRUD操作に適合しないサービスの場合は、ゴールデンパスから逸脱し、RESTfulではない動詞を使用します。

于 2012-05-07T10:39:18.053 に答える