2011-06-26 2 views
0

Rails 3のルートに関する非常に面倒な問題に悩まされています。私は "ショー"と "インデックス"アクションだけを持つ "レビュー"リソースを持っています。私はslugged IDのFriendly ID gemを使用しています。また、レビューにコメントできるネストされたコメントリソースもあります。Ruby on Rails - インデックス/ショーページとページネーションによるレビューリソースのカスタムルーティング

resources :reviews, :only => [:index, :show] do 
    resources :comments, :only => [:new, :create] 
end 

インデックスページのこれまでのパスは、単に「レビュー」であり、showアクションのための「レビュー/マトリックス」のようなものです。これまでのところ単純です。

まず最初に、私はメインのインデックスページで一種の問題にぶつかりました。インデックスページにwill_paginateの宝石があり、私はそのページをキャッシュしています。問題は、パスが/ reviews = page = 2のようなものであればキャッシングは機能しません。代わりに、/ reviews/2 /にページングするときのパスが必要なので、この作品を作る。

match 'reviews(/:page)' => 'reviews#index', :constraints => { :page => /[0-9]/ } 

なぜ制約がありますか?私の 'Show'リソースルートは、上記の行(数値制約なし)が「Show」ルートを妨害する「キャッチオール」に終わっているため動作しないためです。ショーアクションのIDは常に単語になるので、インデックスのページ区切りページには常に数字が表示されますが、これが私がこのようにした理由です。

しかし、ここでは、「ショー」ルートを単に「レビュー/マトリックス」にすることは望ましくありません。すべてのレビューはレビュー対象のタイプ別に分類されていますので、実際には 'ショー'のパスを 'レビュー/ムービー/マトリックス'や 'レビュー/書籍/ロードオブザリング。

「レビュー/書籍」などのカテゴリインデックスページを追加する場合は、元のレビューの「表示」パスを使用します。 (上記の制約のもう一つの理由)しかし、私はこの質問をあまりにも複雑にしたくないので、別のSOの質問のためにそれを保存しようとしています。

これまでの質問に戻る。通常、私は上記のネストされたコメントがレビューリソースにあることを除いて、単純な 'マッチ'ルート(ルートグロビングを使用していますか?)で上記を解決できると思います。コメントのネストされたリソースをレビューに残しながら、上記のような 'ショー'ページを作成するにはどうすればよいですか?

答えて

0

汗がかからない(これが意味する場合)。

match 'reviews(/:page)' => 'reviews#index', :constraints => {:page => /[0-9]+/} 
match 'reviews/comments/:id' => 'comments#my_action', :constraints => {:id => /[0-9]+/} 
match 'reviews/:path' => 'reviews#show', :constraints => {:path => /.+/} 
  • 第3の命令に制約を追加すると、あなたの:path/を使用できるようになります。 (これは本当です:全く制約を使用しないとfoo/barはこのパターンとマッチすることができません)(正規表現/.+/の代わりに、/[a-zA-Z/]+/が望ましいかもしれませんが、それ以前のパスはすでに#show。)
  • ご注文事項。これらの3つは、表示される順に保管してください。