方法使用secure_password验证User模型中缺少的内容

时间:2011-12-21 04:32:18

标签: ruby-on-rails-3.1 railstutorial.org

使用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 userscreated_atpassword_digestupdated_atusername)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: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:in require' from /home/justin/j/RubymineProjects/auth/script/rails:6:in'         来自-e:1:load' from -e:1:in'

  

更新: 这绝对是ruby 1.9.3的某种问题。我在1.9.2上尝试了相同的宝石,我没有任何问题。

2 个答案:

答案 0 :(得分:0)

按如下方式添加验证方法(source)为我解决了这个问题。

我也在使用ruby 1.9.3。我没有像你一样尝试过1.9.2。

答案 1 :(得分:0)

升级到Ruby 1.9.3解决了这个问题。