4

我已经完成了Michael Hartl 的Ruby on Rails 教程。我知道一些关于实例变量、getter 和 setter 的基本概念。

登录方法在这里

def sign_in(user)
  cookies.permanent[:remember_token] = user.remember_token
  self.current_user = user
end

现在我被困在这条线上

self.current_user = user

我找到了这个相关的问题,但我仍然不明白。

登录后,用户将被重定向到另一个页面,因此@current_user将为零。Rails 只能从 cookie 或 session 中获取 current_user ,然后 set @current_user,这样就不需要在当前请求中再次检查 cookie 或 session 了。

签出方法

def sign_out
  self.current_user = nil
  cookies.delete(:remember_token)
end

self.current_user = nil出于同样的原因,既然用户会被重定向到 root_url ,为什么我们需要呢?

这是getter和setter的代码

def current_user=(user)
  @current_user = user
end

def current_user
  @current_user ||= User.find_by_remember_token(cookies[:remember_token])
end
4

3 回答 3

2

重定向后未设置 @current_user 是对的。

@current_user ||= User.find_by_remember_token(cookies[:remember_token])

此语句有助于避免重复调用数据库,但仅当 current_user 变量多次用于单个用户请求时才有用。因此,设置当前用户仅在单个呼叫期间有用。

同样,将当前用户设置为 nil 并在 sign_out 期间从 cookie 中删除令牌可确保后续处理将注销考虑在内。否则,存在其他方法引用当前用户变量并认为用户仍处于登录状态的风险。

于 2012-12-26T10:57:28.967 回答
1

您对本书的下一部分有完整的解释

当前用户

基本上,当您执行 self.current_user= 时,您调用方法 'def current_user= ()' 这是设置器,您可能不仅会在此处分配 @current_user 变量,还会在 cookie 或会话中保留一些参考以供将来参考。以同样的方式,您可能会创建一个看起来像

def current_user
  @current_user ||= get_user_from_cookies
end

为了让当前用户可以访问。我认为你只是走得很快,这本书正试图为不熟悉网络开发的用户一步一步地走

于 2012-12-26T10:17:53.940 回答
1

我相信你说的对,到目前为止你编写的代码并没有太大的区别。

但是,让您的 sign_in/sign_out 方法了解用户如何通过您的应用程序的来龙去脉是没有意义的。如果假设您的应用程序在登录后所做的唯一事情是将用户重定向到根页面,那将是非常脆弱的(而不是它的业务)。

您可以做各种各样的事情,从收集审计数据(例如每次有人登录时记录)到根据用户偏好或用户的其他属性将它们重定向到不同的页面。

于 2012-12-26T10:44:01.307 回答