我使用after_sign_in_path_for
方法在用户登录时实例化用户的会话变量。但是,当用户通过“记住我”功能登录时,这会被绕过。在此处启动用户会话时是否还有另一个函数?我怎样才能确保用户的会话设置与sign_in相同,就像“记住我”自动登录一样?
答案 0 :(得分:0)
我认为没有什么比这更直接了。我认为至少有几种选择。
您的before_filter
中可能有一个ApplicationController
来检查用户是否已登录,如果是,您是否已经做了设置会话的任何操作,如下所示:
before_filter :set_up_session_if_needed
protected
def set_up_session_if_needed
if user_signed_in? && !session[:is_set_up]
# set up session variables here, followed by:
session[:is_set_up] = true
end
end
用户登录后的第一个请求(通过'真实'登录或可记住)将导致您的会话变量被设置,然后:is_set_up
标志将存储在会话中它不会在后续请求中再次完成。请注意,set_up_session_if_needed
应该是after_sign_in_path_for
期间调用的方法,这样您才能干,并且:is_set_up
会话变量得到正确处理。
另一件需要考虑的事情是,如果您希望此时发生任何其他事情 - 例如,您使用的是:trackable
吗?您是否希望更新这些字段?在这种情况下,您可以添加sign_in(user, :force => true)
,但是当您实际上刚刚登录而不是记住时,您需要确保未被调用,否则您的:trackable
登录计数错误。如果您不需要担心这一点,那么根据登录与可记住的情况,您不需要稍微不同的处理方式,因此您无法从set_up_session_if_needed
致电after_sign_in_path_for
,因为上述情况无论如何,代码将被调用为before_filter,无论你在哪里重定向。
这种一般方法感觉有些蠢,但应该做我认为的工作。否则你可能需要尝试覆盖devise的Devise :: Strategies :: Rememberable策略的一部分,该策略试图在给定可记忆的cookie的情况下检索用户(这可能很棘手 - 我没有尝试过这个),或者替换策略如果那是可能的话。可能有更ickier的可能性,但我不会试图描述它们。 before_filter可能是最简单的方法!