繁体   English   中英

Ruby On Rails教程第8章混乱

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM