2

Railscast Episode 275 - 我如何测试使用以下代码向用户发送密码重置:

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

为什么会这样?在某些情况下您必须使用哈希火箭,并且对此有任何指导吗?

4

1 回答 1

7

column在该行代码中不是符号,而是变量,因此您需要使用哈希火箭。column: self[column]将构建一个哈希,其中 key 是 symbol :column,而不是 variable 的值column,这就是你想要的。

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

于 2012-05-31T18:59:44.973 回答