2012-05-31 30 views
2

Railscast Episode 275 - How I test使用下面的代碼來重置密碼發送到用戶:紅寶石哈希火箭VS 1.9語法

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 

這究竟是爲什麼會失敗?有沒有必要使用散列火箭的情況,並且有沒有關於這方面的指導?

回答

7

column在那行代碼中不是一個符號,它是一個變量,所以你需要使用哈希火箭。 column: self[column]會生成一個散列,其中的鍵是符號:column,而不是變量column的值,這正是您想要的。

新語法只是使用文字符號作爲鍵時的快捷鍵(key: value而不是:key => value)。如果您使用的是可變密鑰,那麼=>語法仍然是必需的。

+0

謝謝,這解釋清楚,將在10分鐘內接受 – stephenmurdoch

+4

不只是任何符號,只有符號是有效的標籤。例如':$ set',需要hashrocket和其他許多有效的符號一樣。 http://stackoverflow.com/a/10004344/479863 –