【问题标题】:Item's page and will_paginate项目的页面和 will_paginate
【发布时间】:2010-11-07 02:26:35
【问题描述】:

我有一些通过 will_paginate 插件在连续页面上分割的照片。当您打开一张照片然后使用链接返回所有照片时,您总是会返回到第一页(例如,照片显示在第 5 页,您打开照片,单击链接以显示所有照片并期望您在再次第 5 页,但您在第 1 页)。

现在,有什么方法可以获取照片所属的页码吗?

我尝试传递一个 GET 参数,但这仅在用户不再执行任何操作(例如发表评论、编辑照片、抄送)时才有效。

【问题讨论】:

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


    【解决方案1】:

    页码很大程度上取决于您的搜索结果。根据结果​​集和每页的项目数,您的搜索可能有 1、10 或 100 页。

    “显示所有照片”的任何链接都可以包含搜索和分页信息,使用您描述的 GET 参数。或者通过 cookie 存储和检索,以便搜索结果持续存在,直到用户清除或选择新的搜索。

    【讨论】:

    • 问题是当用户临时离开照片页面(例如修改它)然后尝试返回以显示所有照片时,他总是返回到第一页:(虽然我没有'不要认为使用 cookie 对 SEO 来说是件好事。
    • @collimarco 如果您想在请求之间重用搜索和分页参数,那么您需要将它们保存在某个地方。这通常是 cookie 的用途。不确定这会对 SEO 产生什么影响。
    • 我看到很多摄影网站(比如deviantart.com)使用cookies让用户返回。
    【解决方案2】:
    page = (number_of_records_before_RECORD / number_of_records_per_page) + 1
    

    换句话说。如果你的照片 ID 为 40,之前有 25 条记录(假设部分记录已被删除),每页 20 条记录:

    page = (25 / 20) + 1 = 2
    

    您可以使用Model.count(:conditions => ['id < ?', record.id], :order => 'id') 计算所选记录之前的记录数。 正确的查询取决于您在列出所有对象时对该表应用的排序过滤器。

    【讨论】:

    • 这可能是一个解决方案,但我想知道为什么这个代码在插件中默认没有实现。也许是因为在性能方面按照我说的做没有意义..
    • 因为它对广大受众来说真的没有意义。这不是一个完美的解决方案,而只是满足您特定需求的解决方法。此外,will_paginate 提供分页功能,而不是额外的 ActiveRecord 功能。
    • 我没想到这会对性能造成巨大影响。当您使用分页库时,它将计算您分页的所有内容以获得总页数。如果您要订购的列被正确编入索引,那么获得类似计数以找到当前页面应该不会太痛苦。
    • 如果可以的话,在与查询相同的事务中进行计数以查找当前页面以查找页面中的项目也是值得的 - 否则用户可能会发现自己位于一个没有'没有他们期望的照片,因为照片的数量在查询之间发生了变化。
    • 我同意 wutg Shadwell,这就是我评论“这不是一个完美的解决方案,而只是满足您的特定需求的一种解决方法”的原因,也是这并没有真正使will_paginate 中的意义。如果您想要这样的功能,您应该以最适合您的应用程序和要求的方式对其进行编码。
    【解决方案3】:

    这是另一个解决方案:will_paginate 只使用查询字符串参数“search_field”和“page”;您可以从 Rails 参数哈希中提取这些。如果你跟踪那些使用会话状态的人,你可以在需要时在你的控制器代码中重新应用它们。

    具体如何管理取决于您的应用程序。在我正在开发的应用程序中,流程是这样的,我可以区分一般上下文和成员上下文。用户从 member#index 页面输入成员上下文。所以我只是在进入成员上下文时设置了 session[:member_context];例如在成员#编辑中。然后,在 members#index 中,我有以下代码:

    if session[:member_context]
      @search_field = session[:search_field]
      @page = session[:page]
      # toggle out of member context
      session[:member_context] = nil
    else
      @search_field = params[:search_field]
      @page = params[:page]
      # record lastest search in case the user subsequently enters the member context
      session[:search_field] = @search_field
      session[:page] = @page
    end
    @members = Member.where(<use @search_field>).page(@page)
    # and render ...
    

    这在我的应用程序中效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-22
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多