Ruby hash rocket vs 1.9语法

ste*_*och 2 ruby ruby-on-rails-3

Railscast 第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
Run Code Online (Sandbox Code Playgroud)

我的问题是倒数第二行代码: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
Run Code Online (Sandbox Code Playgroud)

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

Car*_*auf 7

column在那行代码中不是符号,它是一个变量,所以你需要使用哈希火箭.column: self[column]将构建一个散列,其中键是符号:column,而不是变量的值column,这是你想要的.

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

  • 不仅仅是任何符号,只有符号才是有效标签.例如,`:$ set'需要hashrocket和许多其他有效符号一样.http://stackoverflow.com/a/10004344/479863 (4认同)