谁能告诉我Rails中这两个变量赋值方法之间的区别?

时间:2013-11-16 15:36:53

标签: ruby-on-rails ruby cookies

我正在阅读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如何解释这两个不同的赋值语句?

任何帮助将不胜感激!谢谢!

2 个答案:

答案 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的变量中。