2014-02-23 42 views
1

我使用after_sign_in_path_for方法在用户登录时实例化用户的会话变量。但是,当用户通过“记住我”功能登录时绕过该方法。当用户的会话在这里启动时,是否有另一个函数被调用?我如何确保用户会话的设置与sign_in相同,就像“记住我”自动登录一样?“记住我”在启动用户会话时不会调用after_sign_in_path_for

回答

0

我不认为有什么比较直接的。我认为至少有几个选择。

你可以在你的ApplicationController,检查一个before_filter如果有在,如果是签约用户,无论你做了什么你想要做建立自己的会议,是这样的:

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期间调用的方法,以便您可以DRY并且:is_set_up会话变量得到正确处理。

另一件需要考虑的事情是,如果您希望在此时发生其他任何事情 - 例如,您是否使用:trackable,并且您是否希望更新这些字段中的任何一个?在这种情况下,您可以添加一个sign_in(user, :force => true),但您希望确保不是,他们实际上只是登录而不是被记住,否则您的登录数将是错误的。如果您不需要担心这一点,则根据登录与可记住的情况,您不需要稍微不同的处理,因此您可以根本不打电话set_up_session_if_needed,因为上面的代码将被称为before_filter on无论你在哪里重定向。

这种一般方法感觉有点恶心,但应该做我认为的工作。否则,您可能需要尝试覆盖Devise :: Strategies :: Rememberable策略的部分设计,该策略试图通过给定可记忆的cookie来检索用户(这可能比较棘手 - 我没有尝试过),或者替换策略如果这甚至是可能的。有可能甚至更坏的可能性,但我不会试图描述它们。 before_filter可能是最简单的方法!

+0

应该工作的叶子,我从来没有这样做过。很简单。谢谢 – Martyn