2

MagazineのようなモデルとAdモデルがあるとしましょうMagazine :has_many => :ads。ネストされたリソース ルーティングを次のように設定しました。

resources :magazines do 
  resources :ads, :shallow => true do
    get 'search', :action => :search, :on => :collection
  end
end

ここでの私の目標は、ネストされたレベルと浅いレベルの両方で、Rails リソースによって作成されたデフォルトの CRUD ルートと検索ルートにアクセスできるようにすることです。一部の広告には親の雑誌がないため、ユーザーが特定の雑誌のコンテキスト内から検索を制限したり、親の雑誌に関係なくすべての広告を検索したりできるようにしたいと考えています。つまり、次のことができるようになりたいです。

/magazines/1/ads/new
/ads/new

/magazines/1/ads/search
/ads/search

# ... all standard CRUD routes ...

私の懸念は、ビューのパス変数が のようなものに依存していることですnew_magazine_ad_path(@magazine)/ads/index(新しい広告を作成するためのリンクが含まれている必要があります) のようなルートにアクセスすると、ヘルパーを誘導するインスタンスがnew_magazine_ad_path(@magazine)なくてもヘルパーに遭遇すると壊れませんか?@magazine


PS: 通常、私はこれらすべてを自分で試して何が機能するかを確認しますが、現在、上記のセットアップで立ち往生しています-編集、削除、表示、および更新の浅いルートにしか到達できません:

/ads/:id
/ads/:id/edit
/ads/:id (put)
/ads/:id (delete)

新規またはインデックスルートなし:

/ads/index
/ads/new

アップデート

そのため、Shreyas は 2 つのコントローラーを作成することを提案しました。1 つはネストされた Ad を処理し、もう 1 つは浅い Ad を処理します。これは理にかなっていますが、パス ヘルパーを から に変更するためだけに、すべてのビュー コードを複製する必要がありmagazine_ad_path(@magazine)ますad_pathビューの変更を処理するための DRY'er アプローチに関するアイデアはありますか? 他のすべてのビュー コードは同じです。

4

2 に答える 2

2

一部の広告には親の雑誌がないため、ユーザーが特定の雑誌のコンテキスト内から検索を制限したり、親の雑誌に関係なくすべての広告を検索したりできるようにしたい

ここには 2 つの異なる懸念があります。2 つの懸念事項に対して 2 つの異なるコントローラーを用意することをお勧めします。もちろん、1 つはマガジンのコンテキストに属し、もう 1 つはスタンドアロン コントローラー (親マガジンを持たない AD) として提供されます。

このようにして、明確に分離された懸念を持つ 2 つの異なるコントローラーを使用できます。

resources :ads do
  get 'search', :action => :search, :on => :collection
end
resources :magazines do 
  resources :ads, :shallow => true do
    get 'search', :action => :search, :on => :collection
  end
end
于 2011-07-30T06:02:46.250 に答える
0

への 1 回の呼び出しを使用して、url_forいずれかのルートを生成できます ( 経由polymorphic_url)。

url_for [:search, @magazine, :ads]
# when @magazine is present, this is equivalent to search_magazine_ads_url
# when @magazine is nil, it's search_ads_url

url_for [:new, @magazine, :ad] #=> new_magazine_ad_url or new_ad_url
url_for [@magazine, :ads] #=> magazine_ads_url or ads_url

link_to名前付きヘルパーによって生成されたルートの代わりに配列を渡すこともできます。

link_to 'New Ad', [:new, @magazine, :ad]

http://apidock.com/rails/ActionDispatch/Routing/PolymorphicRoutes

于 2013-12-13T17:12:11.447 に答える