1

我试图将分页链接到我的嵌套路由而不是常规的帖子变量。我知道我应该传递一些参数来分页,但我不知道如何传递它们。

基本上有一个数组存储在@posts其中,另一个参数 paginate 可以访问 is category_id

嵌套路由是/category/1/posts,但点击 next 和 previous on 将分页返回一个这样的 url posts?page=1&category_id=7

 <%= will_paginate @most_recent_posts "What do I do here?" %>

这是 Yannis 回答的结果:

在您的控制器中,您可以执行以下操作:

@posts = @category.posts.paginate

在您看来:

<%= will_paginate(@post) %>

这样做会出现以下 URL

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 

必须在块之后声明资源

谢谢斯蒂芬!

4

3 回答 3

3

在这个老问题上跳伞,因为我遇到了同样的问题。

我有几乎完全相同的问题。我听从了响应者的建议,这些路线正在发生一些时髦的事情。我深入研究了路线并发现(根据您的情况进行翻译):

resources :posts
resources :categories do
  resources :posts
end

这使得调用category_posts_path返回(如预期的那样)/category/1/posts

但是,至关重要的是要意识到will_paginate调用类似于的东西url_for,它从路由“向后”工作以找到与参数匹配的第一条路由。

由于resources :posts出现在嵌套路由上方,因此它认为满足要求并且仅插入category_id=1查询字符串。

它对其他人“开箱即用”的原因是因为他们没有将嵌套资源单独列为独立资源。

删除它,你应该没事!

于 2011-01-04T21:58:26.347 回答
1

在您的控制器中,您可以执行以下操作:

@posts = @category.posts.paginate

在您看来:

<%= will_paginate(@post) %>
于 2010-10-24T00:28:21.243 回答
1

好的,所以从问题中不清楚,但我假设您正试图从根级 URL/posts进入特定类别的页面,如/category/1/posts.

我假设这是因为我有嵌套路由(甚至在命名空间中),其中 will_paginate 可以正常工作而无需任何特殊参数。如果不是这种情况,那么您的路线可能还有其他一些奇怪的事情发生,并且需要更多信息来调试。

但是我至少可以解释 will_paginate 是如何工作的。当它url_for使用现有参数和所需的特定页面生成它调用的页面 URL 时。因此,如果您已经设置了一堆参数,它应该保留它们,包括路径本身的一部分。幸运的是,它还允许您传递额外的参数以与(惊喜!):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} %>

如果这不起作用,那么我怀疑你的路线有问题。尝试在模板中放入调试语句并url_for使用不同的参数排列进行调用。请记住,路由定义顺序很重要,并且可能会产生冲突。

于 2010-10-27T05:27:53.350 回答