、ネストされたルートをページ付け、ルビー、レールます
-
25-09-2019 - |
質問
私は、ネストされたルートの代わりに、通常のポスト変数へのリンクにページ付けます取得しようとしています。私はページ付け、いくつかのparamsを渡すようになってるけど、私はそれらを渡す方法がわからない知っています。
は基本的に@posts
に格納された配列があると、他のparamのpaginateであるへのアクセスを有するcategory_id
。
は、ネストされたルートは/category/1/posts
ですが、意志のpaginate上の次と前を打つことは、このposts?page=1&category_id=7
のようなURLを返します。
<%= will_paginate @most_recent_posts "What do I do here?" %>
<時間>
このはヤニスの答えの結果である。
あなたが行うことができますあなたのコントローラには、
@posts = @category.posts.paginate
そして、あなたのビューでます:
<%= will_paginate(@post) %>
これを行うと、次のURL
を思い付きますposts?page=2&post_category_id=athlete_management
<時間>
routes.rbを#there以上のルートですが、これらは関連するものです。
map.resources :posts
map.resources :post_categories, :has_many => :posts
ソリューション
map.resources :post_categories do |post_category|
post_category.resources :posts
end
map.resources :posts
ブロックの後にリソースを宣言するために持っていた。
おかげスティーブン!
解決
パラシュートがここでこの古い問題にして、私は同じ問題が発生したため。
私はかなり正確に同じ問題を抱えていました。私は何かのファンキーは、ルートで起こっていたことを応答の助言に従いました。私はルートに掘って(あなたの状況に合わせて翻訳された)を見つけます:
resources :posts
resources :categories do
resources :posts
end
このそれはそう呼び出しcategory_posts_path
が返されていること(予想通り)/category/1/posts
作られています。
しかし、それはそのwill_paginate
パラメータに一致する最初のルートを見つけるために、ルートから「後方」作品似ているがurl_for
というものを、呼び出す実現するために極めて重要であります。
は、ネストされたルート上のresources :posts
が現れるので、それは1つの満たす要件とちょうどcategory_id=1
挿入し、クエリ文字列であったことをことを見ています。
それは皆のために、「箱から出して」働いていた理由だった。
を削除し、あなたは大丈夫でなければならないこと!
他のヒント
@posts = @category.posts.paginate
そして、あなたのビューでます:
<%= will_paginate(@post) %>
わかりましたので、それは正確に質問から明らかではないが、私はあなたが/posts
のような特定のカテゴリのページに/category/1/posts
のようなルートレベルのURLから行くしようとしていることを仮定しています。
理由。それ以外の場合は、あなたのルートとより多くの情報を持つに行く何か他のファンキーなデバッグに必要となるでしょうがあります。
しかし、私は少なくとも、どのようにwill_paginate作品を説明することができます。それはページのURLを生成していますと、それは、既存のparamsプラス必要な特定のページでurl_for
を呼び出します。あなたは既に設定されているのparamsの束を持っている場合ので、それはパス自体の一部であるものも含めて、それらを保存する必要があります。幸いにもそれはまた、あなたがwill_paginateへ(驚き!):params
パラメータとにマージする追加のparamsを渡すことができます。
これが正しく設定ネストされたルートを持っていると仮定すると、/category/1/posts
はによって生成することができます:
url_for(:controller => 'posts',
:category_id => '1')
しかし、あなたはページ/posts
上にある場合、その後のparamsのみとなります:
{:controller => 'posts'}
あなたがそうのようwill_paginateにCATEGORY_IDを渡す必要がありますのでます:
<%= will_paginate @posts, :params => {:category_id => @posts.first.category_id} %>
これは仕事、あなたのルートと、その後I容疑者何か間違っていない場合。テンプレートにデバッグ文を入れてみてくださいとのparamsの異なる順列でurl_for
を呼び出します。ルート定義の順序が重要と競合を作成することができることを覚えています。