我正在阅读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应用程序允许我退出,但是当从左侧分配变量时,这样:{ {1}},我根本无法退出。谁能告诉我Rails如何解释这两个不同的赋值语句?
任何帮助将不胜感激!谢谢!
答案 0 :(得分:4)
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
的变量。
答案 1 :(得分:1)
这两个陈述是两个完全不同的操作。
对于cookies.permanent[:remember_token] = remember_token
,您要将变量remember_token
的值分配给cookies.permanent
的{{1}}哈希值中的键。
对于:remember_token
,您要检索remember_token = cookies.permanent[:remember_token]
哈希中密钥:remember_token
的值,并将其存储在名为cookies.permanent
的变量中。