Ruby on rails Rails-为什么使用self.current\u user=user in sign\u in方法

Ruby on rails Rails-为什么使用self.current\u user=user in sign\u in方法,ruby-on-rails,ruby,ruby-on-rails-3,instance-variables,self,Ruby On Rails,Ruby,Ruby On Rails 3,Instance Variables,Self,我已经完成了迈克尔·哈特尔的作品。我知道一些关于实例变量、getter和setter的基本概念 sign_-in方法是 现在我被困在这条线上了 self.current_user = user 我发现这有关系,但我还是不明白 登录后,用户将被重定向到另一个页面,因此@current\u user将为零。Rails只能从cookie或会话中获取当前用户,然后设置@current\u user,这样就不需要在当前请求中再次检查cookie或会话 签入/签出方法 def sign_out sel

我已经完成了迈克尔·哈特尔的作品。我知道一些关于实例变量、getter和setter的基本概念

sign_-in方法是

现在我被困在这条线上了

self.current_user = user
我发现这有关系,但我还是不明白

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

签入/签出方法

def sign_out
  self.current_user = nil
  cookies.delete(:remember_token)
end
出于同样的原因,为什么我们需要
self.current\u user=nil
,因为用户将被重定向到root\u 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

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

基本上,当您执行self.current_user=您为方法'def current_user=()'创建发票时,您可能不仅在此处分配@current_user变量,而且在cookie或会话中保留一些引用以供将来参考。同样,您可能会创建一个如下所示的访问器

def current_user
  @current_user ||= get_user_from_cookies
end

以使当前用户能够访问。我认为您刚刚开始快速阅读,这本书试图一步一步地为不熟悉web开发的用户提供帮助。我相信您说得对,对于您编写的代码来说,这没有多大区别

但是,让您的登录/注销方法知道用户如何在应用程序中穿行的细节是没有意义的。如果它假设应用程序在登录后所做的唯一事情就是将用户重定向到根页面,那么它将非常脆弱(而不是它的业务)


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

重定向后未设置@current_用户,这是对的

@current_user ||= User.find_by_remember_token(cookies[:remember_token])
此语句有助于避免重复调用数据库,但只有在单个用户请求多次使用当前_用户变量时才有用。因此,设置当前用户仅在一次呼叫中有用


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

谢谢,但我有点困惑。我已经在
sign\u in
方法中的cookies中放入了令牌,因此我不知道在setter中要做什么。那么您就不必做任何其他事情了,作者可能将其作为setter,因为在设置当前用户时,您很可能需要执行各种操作,或者可能只是为了解释如何覆盖setter现在我将用户重定向到主页或在SessionController#create中执行其他操作。这些代码不在登录/注销方法中。
@current_user ||= User.find_by_remember_token(cookies[:remember_token])