使Session变量仅在下一个请求之前可用

时间:2011-02-11 06:38:50

标签: ruby-on-rails

这是一个场景。网络冲浪者(访客)位于网站的购买页面中。在该页面中,访问者可以输入新的用户注册详细信息,信用卡信息并完成购买,同时创建新用户或者可以使用其现有帐户登录。如果访问者决定使用其现有帐户登录,则需要在创建新会话后将其重定向到同一购买页面。我通过使用两个会话变量 session [:pchase_page_after_login] = true session [:path_purchase_page] = path_of_current_page 来实现这一目标。登录后,我将这些变量设为零。

如果用户从购买页面登录,所有这些都可以正常工作。但是,如果用户从购买页面转到其他页面,则这两个会话变量仍然存储在会话中,并且不是零。因此,如果在浏览少量其他页面后,访问者尝试登录,则会将其重定向到与会话[:pchase_page_after_login] = true 会话[:path_purchase_page] = <相同的购买页面/ strong>仍然存在。因此,我想知道是否有办法允许特定会话变量仅在下一个请求中可用。我知道:flash 中的内容仅在下一个请求中可用,但我不知道用于此目的是否明智。会话变量更合适,但我希望这两个会话变量仅可用于下一个请求。有没有办法实现这个目标?提前致谢

2 个答案:

答案 0 :(得分:2)

我建议您使用前置过滤器来实现此目的。例如,您可以执行以下操作:

class ApplicationController
  before_filter :delete_session_purchase

  protected

  def delete_session_purchase
    session.delete :path_purchase_page
    session.delete :purchase_page_after_login
  end
end

class SessionsController
  skip_before_filter :delete_session_purchase, :only => [:new, :create]
end

这意味着在任何常规请求中,您将删除将用户重定向到购买页面的会话变量,但是在登录操作中,您可以保留这些变量。这将确保在正常情况下简单地删除会话变量,除非您想要保留它们。

答案 1 :(得分:1)

在这种情况下,您确实需要flash。它存储在会话中,但它只是在下一个请求后自动填充。自定义解决方案最终会有效地复制闪存已有的功能。

或者,您可以在登录后redirect_to :back,这会将他们带回到他们登录的页面。