【发布时间】:2011-03-29 05:00:44
【问题描述】:
我有一个带有照片的应用程序。用户可以直接通过链接或书签等方式查看照片,也可以搜索照片,也可以浏览照片文件夹。
无论他们如何找到照片,他们都会登陆photos#show 视图。但是,他们可以从photos#search 或folders#show 访问该视图。
我一直致力于创建“下一张/上一张”照片功能。这是我到目前为止所得到的......
在任何显示照片索引的控制器动作中,都有以下行:
session[:query] = @photos.map(&:id)
这会为要在该视图中显示给用户的照片生成一个 id 数组。
这是照片模型:
# NEXT / PREVIOUS FUNCTIONALITY
def previous(query)
unless query.nil?
index = query.find_index(self.id)
prev_id = query[index-1] unless index.zero?
self.class.find_by_id(prev_id)
end
end
def next(query)
unless query.nil?
index = query.find_index(self.id)
next_id = query[index+1] unless index == query.size
self.class.find_by_id(next_id)
end
end
上述方法接受 ids 数组,在该数组中找到当前照片的位置,然后找到它之前和之后的 ids。
那么,在photos#show 控制器中我有:
...
if session[:query]
@next_photo = @photo.next(session[:query])
@prev_photo = @photo.previous(session[:query])
end
...
所以,这实际上效果很好,但有一个很大的“陷阱”:
如果用户通过浏览网站来查看照片,一切都很好,但如果用户通过书签、链接或跳过他们的历史记录来查看照片,那么 SESSION 仍然会继续旧查询,但用户现在正在查看可能属于或可能不是该查询一部分的照片,并且显示的“下一张”和“上一张”照片现在是旧查询的一部分。
这有点令人困惑,所以想象一下(最简单的情况):
用户浏览图片文件夹,并找到 ID 为:1、2、3、4、5 的照片
用户浏览了一下,认为照片 4 很整洁。在查看照片 4 时,照片 3 和 5 显示为“上一张”和“下一张”。用户将此页面添加为书签。
然后用户进行搜索,返回照片:1、4、7、9、12
用户点击照片 1,查看图片,然后离开站点片刻去维基百科或其他东西。想要返回该站点的用户单击照片 4 的书签。
现在用户看到了照片 4,但由于会话中的最后一次查询是搜索,因此用户将照片 1 和 7 视为上一张/下一张,而用户上次访问此页面时,他看到的是照片 3 和 5。
换句话说,一旦查询被加载到会话中,它就会一直存在,这通常很好,除非用户使用书签或历史记录等直接在照片周围跳转。在这种情况下,如果会话是更好的刚刚清除,因此不会显示“下一张/上一张”照片(因为用户没有从索引浏览到此页面)。
所以,这些问题的所有设置:
有没有办法根据引用者清除 session[:query] 参数? IE 之类的,如果用户不是从
folders#show或photos#search或原始查询中包含的另一张照片到达这里,那么忘记旧查询。有没有办法让视图也响应前一个引用者?比如,如果用户从
folders#show到达那里,然后说“此文件夹中的其他照片”,但如果用户从photos#search到达那里,那么说“下一个搜索结果/上一个搜索结果”
我对此感到很困惑,如果有任何建议,我将不胜感激。
谢谢!!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 session view conditional