代码之家  ›  专栏  ›  技术社区  ›  Sam å±±

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

  •  1
  • Sam å±±  · 技术社区  · 14 年前

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

    /category/1/posts 但点击next和previous将分页返回如下url posts?page=1&category_id=7 .

     <%= 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#有更多的路线,但这些是相关的

    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 
    

    谢谢斯蒂芬!

    3 回复  |  直到 14 年前
        1
  •  3
  •   Steven    14 年前

    在这里跳伞回答这个老问题是因为我遇到了同样的问题。

    我也有同样的问题。我听从了反应者的建议,说路线上发生了一些奇怪的事情。我深入调查了路线,发现(翻译成适合你的情况):

    resources :posts
    resources :categories do
      resources :posts
    end
    

    所以打电话来 category_posts_path /category/1/posts .

    然而,认识到这一点至关重要 will_paginate 调用类似于 url_for ,它从路由“向后”查找与参数匹配的第一个路由。

    自从 resources :posts category_id=1 是一个查询字符串。

    把那个拿开你就没事了!

        2
  •  1
  •   Yannis    14 年前

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

    @posts = @category.posts.paginate
    

    <%= will_paginate(@post) %>
    
        3
  •  1
  •   gtd    14 年前

    好吧,所以这个问题不太清楚,但我假设您试图从根级别URL /posts /category/1/posts .

    我之所以假设这是因为我有嵌套的路由(甚至在命名空间中),在没有任何特殊参数的情况下,这些路由可以正常分页。如果不是这样的话,那么您的路由可能还有一些其他的问题,需要更多的信息来调试。

    url_for 使用现有的参数加上所需的特定页面。因此,如果您已经设置了一组参数,它应该保留它们,包括路径本身的一部分。幸运的是,它还允许您传递额外的参数以与(惊奇!) :params 要分页的参数。

    现在假设您已经正确设置了嵌套路由, /类别/1/员额 可通过以下方式生成:

    url_for(:controller => 'posts', 
            :category_id => '1')
    

    /岗位 则参数将仅为:

    {:controller => 'posts'}
    

    因此,您需要将类别id传递给will,如下所示:

    <%= will_paginate @posts, :params => {:category_id => @posts.first.category_id} %>
    

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