2009-06-30 69 views
7

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

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

我试着传递一个GET参数,但这只适用于用户不执行任何更多操作(例如发表评论,编辑照片,ecc)。

回答

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

0

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

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

+0

问题是,当用户临时离开照片页面(例如修改它),然后试图返回以显示所有照片,他总是返回到第一页:( 虽然我不认为使用Cookie对于搜索引擎优化是一件好事 – collimarco 2009-06-30 18:52:59

+1

@collimarco如果你想在请求之间重复使用搜索和分页参数,那么你需要将它们保存在某个地方,这通常是cookies的用途。不知道这会对搜索引擎优化产生什么影响。 – 2009-06-30 19:09:17

0

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

您的管理方式取决于您的应用程序。在我正在开发的应用程序中,流程可以区分一般上下文和成员上下文。用户从成员#索引页面输入成员上下文。所以我只需将会话[:member_context]设置为成员上下文;例如在成员#编辑。然后,在成员#索引中,我有以下代码:

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 ... 

这很适合我的应用程序。