Использование Rails 3.1.3. Я использую метод аутентификации по паролю, представленный в Railscast 270, чтобы сделать вызов has_secure_password:
class User < ActiveRecord::Base
has_secure_password
end
Это работает, за исключением одной чрезвычайно загадочной проблемы. Документация гласит использовать
user.authenticate ("notright")
Но я не вижу, где объявлен метод аутентификации. Я посмотрел в secure_password, и, казалось бы, эквивалентный метод:
# Returns self if the password is correct, otherwise false.
def get_logged_in_user(unencrypted_password)
if BCrypt::Password.new(password_digest) == unencrypted_password
self
else
false
end
end
Заметьте, я пытаюсь преобразовать пример из railstutorial.org (действительно замечательно), поэтому мне пришлось кое-что изменить, и в моем приложении могло быть что-то противоречащее. Например, у меня ранее была эта строка:
attr_accessor :password
И это препятствовало тому, чтобы объявление пароля = вызывалось в secure_password, в результате столбец db для password_digest был равен нулю. Удаление этой строки исправило эту проблему.
Обновление: я создал новое приложение rails с 3.1.3 и подтвердил, что простейший случай выполнения этих двух команд приводит к ошибке:
u = User.create (: username => "a",: password => "foobar",: password_confirmation => "foobar")
(0,1 мс) НАЧАТЬ
SQL (0,2 мс) INSERT INTO users
(created_at
, password_digest
, updated_at
, username
) ЗНАЧЕНИЯ ('2011-12-21 05:18:17', '$ 2a $ 10 $ BbwHbq1bGwvQRgE0xK28VeP8K / lwY .VfLaLsMSs6ogNa1DucephnK ',' 2011-12-21 05:18:17 ',' a ')
(42,6 мс) COMMIT
u.authenticate ( "Foobar")
u.authenticate ( "Foobar")
NoMethodError: неопределенный метод authenticate' for #<User:0xa26e4cc>
from /home/justin/.rvm/gems/ruby-1.9.3-p0@testapp/gems/activemodel-3.1.3/lib/active_model/attribute_methods.rb:385:in
method_missing '
из /home/justin/.rvm/gems/ruby-1.9.3-p0@testapp/gems/activerecord-3.1.3/lib/active_record/attribute_methods.rb:60:in method_missing'
from (irb):4
from /home/justin/.rvm/gems/ruby-1.9.3-p0@testapp/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in
start '
от /home/justin/.rvm/gems/ruby-1.9.3-p0@testapp/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in start'
from /home/justin/.rvm/gems/ruby-1.9.3-p0@testapp/gems/railties-3.1.3/lib/rails/commands.rb:40:in
'
из / home / justin / j / RubymineProjects / auth / script / rails: 6: в require'
from /home/justin/j/RubymineProjects/auth/script/rails:6:in
'
из -e: 1: в load'
from -e:1:in
'
UPDATE:
Это определенно какая-то проблема с ruby 1.9.3. Я попробовал те же самые драгоценности на 1.9.2, и у меня нет проблем.