Ruby hash rocket vs 1.9语法

时间:2012-05-31 18:57:47

标签: ruby ruby-on-rails-3

Railscast Episode 275 - How I test使用以下代码向用户发送密码重置:

def send_password_reset
  generate_token(:password_reset_token)
  ....
  ... etc
end

def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

我的问题是倒数第二行代码:end while User.exists?(column => self[column])它的工作正常,但如果换掉哈希火箭,end while User.exists?(column: self[column])

会导致我的规格失败
Failure/Error: user.send_password_reset
   ActiveRecord::StatementInvalid:
   SQLite3::SQLException: no such column: users.column: SELECT  1 FROM "users"  WHERE "users"."column" = 'Y7JJV4VAKBbf77zKFVH7RQ' LIMIT 1

为什么会这样?是否有必须使用哈希火箭的情况,是否有任何指导方针?

1 个答案:

答案 0 :(得分:7)

该代码行中的

column不是一个符号,它是一个变量,所以你需要使用哈希火箭。 column: self[column]会构建一个散列,其中键是符号:column,而不是变量column的值,这就是你想要的。

对语法使用文字符号(key: value而不是:key => value)时,新语法只是一种快捷方式。如果您使用的是变量键,则仍需要=>语法。