[英]Ruby On Rails Tutorial Chapter 8 Confusion
大家好! 最近,我正在研究Michael Hartle的RoR教程。 在第8章中,我遇到了一个困扰我两天的问题。 这是问题所在。 在第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中的代码,用户的登录状态将被遗忘:as当用户转到另一个页面时,会话将结束,用户将自动退出。 为了避免这个问题,我们可以找到与代码清单8.19中的代码创建的记忆标记相对应的用户,如代码清单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”,直到他明确注销为止,对吧?
之前的代码不会将用户注销,因为不会在后续请求中重新创建用户。
状态不会在请求之间共享,并且必须随每个请求重新创建。 @current_user
是一个实例变量,并在单个请求的持续时间内保持其值。
为了解决状态未共享这一事实,我们需要从每个请求中重新加载必要的变量,例如@current_user
,这些变量在会话中很常见,在这种情况下,它们使用的是remember_token
cookie。
第一段代码不会在每个请求上重新加载@current_user
,因此一旦用户在登录后浏览到另一个页面就会忘记它保持的值,第二个片段尝试通过remember_token
cookie加载当前用户,所以之后这是在有人登录时设置的,应该记住用户,直到该cookie过期。
他在这里说的是,当我们在第一个例子中使用@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的页面时,它将被填充。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.