项目的页面和will_paginate

时间:2009-06-30 18:18:44

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

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

现在,有没有办法获取照片所属的页码?

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

3 个答案:

答案 0 :(得分:8)

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')计算所选记录之前的记录数。 正确的查询取决于列出所有对象时应用于该表的排序过滤器。

答案 1 :(得分:0)

页码高度依赖于您的搜索结果。您的搜索可能包含1页,10页或100页,具体取决于结果集和每页的项目数。

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

答案 2 :(得分:0)

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

您的具体管理方式取决于您的应用程序。在我正在开发的应用程序中,流程是这样的,我可以区分一般上下文和成员上下文。用户从成员#index页面输入成员上下文。所以我只是在成员上下文的入口处设置session [:member_context];例如在成员#edit。然后,在成员#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 ...

这在我的应用程序中非常有用。