我正试图将paginate链接到我的嵌套路由而不是常规的posts变量。我知道我应该将一些参数传递给分页,但我不知道如何传递它们。
基本上,@posts
中存储了一个数组,而另一个param paginate可以访问category_id
。
嵌套路线为/category/1/posts
,但点击下一页和上一页将会返回一个类似于此posts?page=1&category_id=7
的网址。
<%= will_paginate @most_recent_posts "What do I do here?" %>
这是Yannis回答的结果:
在您的控制器中,您可以:
@posts = @category.posts.paginate
在你看来:
<%= will_paginate(@post) %>
执行此操作会出现以下网址
posts?page=2&post_category_id=athlete_management
routes.rb#有更多路线,但这些是相关路线
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
必须在块
之后声明资源谢谢stephen!
答案 0 :(得分:3)
在这个旧问题上跳伞,因为我遇到了同样的问题。
我有完全相同的问题。我按照应急人员的建议,发现了一些时髦的路线。我挖掘了路线并找到了(根据你的情况翻译):
resources :posts
resources :categories do
resources :posts
end
这使得调用category_posts_path
返回(按预期)/category/1/posts
。
然而,要认识到will_paginate
调用类似于url_for
的东西至关重要,resources :posts
会从路线“向后”工作,以找到与参数匹配的第一条路线。
由于category_id=1
出现在嵌套路由之上,因此它看到那个满足要求,只是插入{{1}}是一个查询字符串。
它为所有其他人“开箱即用”工作的原因是因为他们没有将嵌套资源单独列为独立资源。
删除它,你应该没事!
答案 1 :(得分:1)
在您的控制器中,您可以:
@posts = @category.posts.paginate
在你看来:
<%= will_paginate(@post) %>
答案 2 :(得分:1)
好的,所以问题并不完全清楚,但我假设你试图从/posts
这样的根级网址转到特定类别的网页,例如/category/1/posts
。< / p>
我之所以认为这是因为我有嵌套路由(甚至在命名空间中),其中will_paginate工作正常,没有任何特殊的参数。如果情况并非如此,那么您的路线可能还会有其他问题,需要更多信息进行调试。
但是我至少可以解释一下will_paginate是如何工作的。当它生成页面URL时,它会使用现有的参数以及所需的特定页面调用url_for
。因此,如果你已经设置了一堆参数,它应该保留它们,包括那些属于路径本身的参数。幸运的是,它还允许您传递额外的参数以与(surprise!):params
参数合并到will_paginate。
现在假设您已正确设置嵌套路由,可以通过以下方式生成/category/1/posts
:
url_for(:controller => 'posts',
:category_id => '1')
但如果你在页面/posts
上,那么参数只会是:
{:controller => 'posts'}
所以你需要将category_id传递给will_paginate,如下所示:
<%= will_paginate @posts, :params => {:category_id => @posts.first.category_id} %>
如果这不起作用,那么我怀疑你的路线有问题。尝试在模板中放置一个调试语句,并使用params的不同排列调用url_for
。请记住,路线定义顺序很重要,可能会产生冲突。