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)是,则可以检查会话变量以检查来自哪个控制器/操作。