将分页,嵌套路由,ruby,rails

时间:2010-10-23 18:07:22

标签: ruby-on-rails ruby will-paginate

我正试图将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!

3 个答案:

答案 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。请记住,路线定义顺序很重要,可能会产生冲突。