各位!最近,我正在研究Michael的RoR教程。在第八章中,我遇到了一个困扰我两天的问题。这就是问题所在。见第8.2.3节。
module SessionsHelper
def sign_in(user)
.
.
.
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user # Useless! Don't use this line.
end
end迈克尔写道:
如果这样做,我们将有效地复制attr_accessor的功能,我们在第4.4.5.5节中看到了这一点--问题是它完全解决不了我们的问题:使用清单8.21中的代码,用户的签名状态就会被遗忘:一旦用户进入另一个页面,poof!-the会话就会结束,用户将被自动签出。为了避免这个问题,我们可以找到与清单8.19中的代码创建的remember令牌对应的用户,如清单8.22所示。
清单8.22。
module SessionsHelper
.
.
.
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
end我的问题是:为什么前面的代码会使会话在用户转到新页面时自动注销?为什么第二段代码不会呢?我认为,只要用户登录,@current_ user的值将始终是"user“,直到他显式地退出为止,对吗?
发布于 2012-08-22 02:34:33
前面的代码并不是将用户注销,而是在随后的请求中重新创建用户。
状态不是在请求之间共享的,必须与每个请求一起重新创建。@current_user是一个实例变量,在单个请求的持续时间内保持它的值。
为了避免状态不共享的事实,对于每个请求,我们需要从会话中常见的内容中重新加载必要的变量(如@current_user ),在这种情况下,它们使用remember_token cookie。
第一个代码段不会在每个请求上重新加载@current_user,因此当用户登录后浏览到另一个页面时,会忘记它保存的值,第二个代码段试图通过remember_token cookie加载当前用户,因此在有人登录时设置了这个值之后,应该记住用户直到该cookie过期。
发布于 2012-08-22 02:35:15
他在这里说的是,当我们在第一个例子中使用@current_user时,当我们没有在页面的符号上使用时,我们没有调用@current_user = User.find(1)。我们已经开始依赖它了。由于我们没有显式地设置@current_user,所以如下所示:
@current_user ||= User.find_by_remember_token(cookies[:remember_token])如果未设置@current_user,则通过使用存储在cookie中的id查找用户来设置它。这样,当我们导航到没有显式设置@current_user的页面时,它将被填充。
https://stackoverflow.com/questions/12065539
复制相似问题