使用Rails 3.1.3。我正在使用railscast 270中提供的密码验证方法将呼叫置于“has_secure_password”:
class User < ActiveRecord::Base
has_secure_password
end
除了一个非常令人费解的问题外,它有效。文档说明要使用
user.authenticate(“notright”)
但是我看不到声明authenticate方法的位置。我查看了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中调用password =的声明,导致password_digest的db列为nil。删除此行可修复此问题。
更新:我用3.1.3创建了一个全新的rails应用程序,并确认运行这两个命令的最简单的情况会导致错误:
u = User.create(:username =&gt;“a”,:password =&gt;“foobar”,:password_confirmation =&gt;“foobar”) (0.1ms)BEGIN SQL(0.2ms)INSERT INTO
users
(created_at
,password_digest
,updated_at
,username
)VALUES('2011-12-21 05:18:17 ','$ 2a $ 10 $ BbwHbq1bGwvQRgE0xK28VeP8K / lwY.VfLaLsMSs6ogNa1DucephnK','2011-12-21 05:18:17','a') (42.6ms)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:inmethod_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:instart' 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:inrequire' from /home/justin/j/RubymineProjects/auth/script/rails:6:in
' 来自-e:1:load' from -e:1:in
'
更新: 这绝对是ruby 1.9.3的某种问题。我在1.9.2上尝试了相同的宝石,我没有任何问题。
答案 0 :(得分:0)
按如下方式添加验证方法(source)为我解决了这个问题。
我也在使用ruby 1.9.3。我没有像你一样尝试过1.9.2。
答案 1 :(得分:0)
升级到Ruby 1.9.3解决了这个问题。