首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails教程第8章混乱

Rails教程第8章混乱
EN

Stack Overflow用户
提问于 2012-08-22 02:17:46
回答 2查看 323关注 0票数 1

各位!最近,我正在研究Michael的RoR教程。在第八章中,我遇到了一个困扰我两天的问题。这就是问题所在。见第8.2.3节。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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“,直到他显式地退出为止,对吗?

EN

回答 2

Stack Overflow用户

发布于 2012-08-22 02:34:33

前面的代码并不是将用户注销,而是在随后的请求中重新创建用户。

状态不是在请求之间共享的,必须与每个请求一起重新创建。@current_user是一个实例变量,在单个请求的持续时间内保持它的值。

为了避免状态不共享的事实,对于每个请求,我们需要从会话中常见的内容中重新加载必要的变量(如@current_user ),在这种情况下,它们使用remember_token cookie。

第一个代码段不会在每个请求上重新加载@current_user,因此当用户登录后浏览到另一个页面时,会忘记它保存的值,第二个代码段试图通过remember_token cookie加载当前用户,因此在有人登录时设置了这个值之后,应该记住用户直到该cookie过期。

票数 2
EN

Stack Overflow用户

发布于 2012-08-22 02:35:15

他在这里说的是,当我们在第一个例子中使用@current_user时,当我们没有在页面的符号上使用时,我们没有调用@current_user = User.find(1)。我们已经开始依赖它了。由于我们没有显式地设置@current_user,所以如下所示:

代码语言:javascript
复制
@current_user ||= User.find_by_remember_token(cookies[:remember_token])

如果未设置@current_user,则通过使用存储在cookie中的id查找用户来设置它。这样,当我们导航到没有显式设置@current_user的页面时,它将被填充。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12065539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档