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
为什么会这样?是否有必须使用哈希火箭的情况,是否有任何指导方针?
答案 0 :(得分:7)
column
不是一个符号,它是一个变量,所以你需要使用哈希火箭。 column: self[column]
会构建一个散列,其中键是符号:column
,而不是变量column
的值,这就是你想要的。
对语法使用文字符号(key: value
而不是:key => value
)时,新语法只是一种快捷方式。如果您使用的是变量键,则仍需要=>
语法。