Ruby on rails Rails:sessions+;依赖于推荐人的观点?
我有一个带有照片的应用程序。用户可以通过链接或书签等直接查看照片,也可以搜索照片,或者浏览照片文件夹 无论他们如何找到一张照片,他们都会登陆到Ruby on rails Rails:sessions+;依赖于推荐人的观点?,ruby-on-rails,ruby-on-rails-3,session,view,conditional,Ruby On Rails,Ruby On Rails 3,Session,View,Conditional,我有一个带有照片的应用程序。用户可以通过链接或书签等直接查看照片,也可以搜索照片,或者浏览照片文件夹 无论他们如何找到一张照片,他们都会登陆到photos#show视图。但是,他们可以从照片35;搜索或从文件夹#显示进入该视图 我一直在努力创建“下一个/上一个”照片功能。这是我到目前为止得到的 在显示照片索引的任何控制器操作中,都有以下行: session[:query] = @photos.map(&:id) 这将为将在该视图中显示给用户的照片生成一个ID数组 以下是照片模型: #
photos#show
视图。但是,他们可以从照片35;搜索
或从文件夹#显示
进入该视图
我一直在努力创建“下一个/上一个”照片功能。这是我到目前为止得到的
在显示照片索引的任何控制器操作中,都有以下行:
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
上述方法接受ID数组,查找该数组中的当前照片位置,然后查找其前后的ID
那么,在照片中#显示控制器中我有:
...
if session[:query]
@next_photo = @photo.next(session[:query])
@prev_photo = @photo.previous(session[:query])
end
...
所以,这实际上效果很好,但有一个很大的“问题”:
如果用户通过浏览网站来查看照片,一切正常,但如果用户通过书签、链接或跳回历史记录来查看照片,则会话仍保留旧查询,但用户现在查看的照片可能是或可能不是该查询的一部分,“下一步”和显示的“以前”照片现在是旧查询的一部分
这有点让人困惑,所以想象一下以下(最简单的情况):
用户浏览图像文件夹,找到ID为1、2、3、4、5的照片
用户浏览了一下,认为照片4很整洁。当查看照片4时,照片3和5显示为“上一张”和“下一张”。用户将此页面添加为书签
然后用户进行搜索,返回照片:1、4、7、9、12
用户单击照片1,查看图片,然后离开站点片刻,转到wikipedia或其他网站。想要返回站点,用户单击照片4的书签
现在用户看到照片4,但由于会话中的最后一次查询是为了搜索,因此用户将照片1和7视为上一次/下一次,而用户上次访问此页面时,他看到了照片3和5
换句话说,一旦一个查询被加载到会话中,它就会一直存在,这通常是好的,除非用户使用书签或历史记录等直接跳转到照片周围。在这种情况下,如果会话刚刚被清除,则会更好,因此不会显示“下一个/上一个”照片(因为用户没有从索引浏览到此页面)
因此,所有这些问题的设置:
是否有一种方法可以根据引用者清除会话[:query]参数?例如,如果用户不是从文件夹#show
或照片#search
或原始查询中包含的另一张照片到达此处,则忘记旧查询
有没有办法让视图也响应以前的引用人?比如,如果用户是从文件夹#show
到达该文件夹的,则说“此文件夹中的其他照片”,但如果用户是从照片#search
到达该文件夹的,则说“下一个搜索结果/上一个搜索结果”
这件事让我很困惑,如果有任何建议,我将不胜感激
谢谢!!您可以执行以下操作:
session[:query] = nil if /photos\/search|folders\/show/.match(request.env["HTTP_REFERER"]) || photo_included_in_query
您将在其中实现photo_included_in_查询方法
对于视图,您可以将此逻辑分解到帮助器中,例如:
def request_from_folder?
/folders\/show/.match(request.env["HTTP_REFERER"])
end
在你看来:
<% if request_from_folder? %>
Other photos from this folder
<% else %>
Next/Previous
<% end %>
此文件夹中的其他照片
下一个/上一个
Hmm,很有意思。关于根据推荐人确定一点视图,您有什么建议?我想到的另一个解决方案是在应用程序控制器中使用after\u过滤器来设置一个session\u变量,说明您当前所在的位置(即,controller\u name和action\u name)是,则可以检查会话变量以检查来自哪个控制器/操作。