【问题标题】:Rails: sessions + views dependent on referrer?Rails:依赖于推荐人的会话+视图?
【发布时间】:2011-03-29 05:00:44
【问题描述】:

我有一个带有照片的应用程序。用户可以直接通过链接或书签等方式查看照片,也可以搜索照片,也可以浏览照片文件夹。

无论他们如何找到照片,他们都会登陆photos#show 视图。但是,他们可以从photos#searchfolders#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。


换句话说,一旦查询被加载到会话中,它就会一直存在,这通常很好,除非用户使用书签或历史记录等直接在照片周围跳转。在这种情况下,如果会话是更好的刚刚清除,因此不会显示“下一张/上一张”照片(因为用户没有从索引浏览到此页面)。

所以,这些问题的所有设置:

  1. 有没有办法根据引用者清除 session[:query] 参数? IE 之类的,如果用户不是从 folders#showphotos#search 或原始查询中包含的另一张照片到达这里,那么忘记旧查询。

  2. 有没有办法让视图也响应前一个引用者?比如,如果用户从folders#show 到达那里,然后说“此文件夹中的其他照片”,但如果用户从photos#search 到达那里,那么说“下一个搜索结果/上一个搜索结果”

我对此感到很困惑,如果有任何建议,我将不胜感激。

谢谢!!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 session view conditional


    【解决方案1】:

    你可以这样做:

    session[:query] = nil if /photos\/search|folders\/show/.match(request.env["HTTP_REFERER"]) || photo_included_in_query
    

    您将在哪里实现 photo_included_in_query 方法。

    对于视图,您可以将此逻辑分解为帮助程序,例如:

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

    【讨论】:

    • 嗯,很有趣。关于根据推荐人确定一些观点,您有什么建议?
    • 我想到的另一个解决方案是在您的应用程序控制器中使用 after_filter 来设置 session_variable 说明您当前的位置(即,controller_name 和 action_name),然后您可以检查会话变量以检查你来自什么控制器/动作。
    猜你喜欢
    • 2015-02-19
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2011-01-20
    • 2016-03-31
    相关资源
    最近更新 更多