我正在阅读Michael Hartl的Rails教程书,我发现了这个变量赋值语句:cookies.permanent[:remember_token] = remember_token
与这个变量赋值语句不同:remember_token = cookies.permanent[:remember_token]
。 这些行取自下面的此函数,用于将用户登录到 Web 应用程序。
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.encrypt(remember_token))
self.current_user = user
end
下面是一些附加代码,可帮助您了解此处发生的情况。
def signed_in?
!current_user.nil?
end
def sign_out
self.current_user = nil
cookies.delete(:remember_token)
end
def current_user=(user)
@current_user = user
end
def current_user
remember_token = User.encrypt(cookies[:remember_token])
@current_user ||= User.find_by(remember_token: remember_token)
end
当sign_in(user)
是这样写的:cookies.permanent[:remember_token] = remember_token
Web 应用程序允许我在单击注销链接时注销,但是当变量从左侧分配时,如下所示:remember_token = cookies.permanent[:remember_token]
,我根本无法注销。 谁能告诉我 Rails 如何解释这两个不同的赋值语句?
任何帮助将不胜感激! 谢谢!
它对 Rails 没有什么特别之处。如果您对某些编程语言知之甚少,您应该注意到:
foo = bar
表示将 bar
的计算值分配给名为 foo
的变量。这与
bar = foo
这意味着将 foo
的计算值分配给名为 bar
的变量。
通常,编程初学者将这种=
作为赋值与数学中使用的相等=
混淆。但在编程中,平等是==
的,而不是=
的。
在你的问题中,
cookies.permanent[:remember_token] = remember_token
甚至与变量赋值不同。假设cookies.permanent
是一个哈希,它将值remember_token
分配给该哈希中的键:remember_token
。
remember_token = cookies.permanent[:remember_token]
另一方面,将cookies.permanent[:remember_token]
分配给名为 remember_token
的变量。
语句是两个完全不同的操作。
对于cookies.permanent[:remember_token] = remember_token
,您将变量remember_token
的值分配给 :remember_token
的cookies.permanent
哈希中的键。
对于remember_token = cookies.permanent[:remember_token]
,您正在检索cookies.permanent
哈希中键:remember_token
的值,并将其存储在名为 remember_token
的变量中。