2012-05-31 2 views
2

Railscast Episode 275 - How I test использует следующий код для отправки пароля сброса пользователей:Рубиновых хэш ракеты против 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 –

Смежные вопросы