wiz*_*tjh 2 authentication activerecord ruby-on-rails activemodel ruby-on-rails-3.1
我尝试按照http://bcardarella.com/post/4668842452/exploring-rails-3-1-activemodel-securepassword使用rails 3.1 ActiveModel :: SecurePassword
我最后得到了红灯......
user.rb
class User < ActiveRecord::Base
has_secure_password
validates :password, :presence => { :on => :create }
end
Run Code Online (Sandbox Code Playgroud)
factory.rb
Factory.define :user do |f|
f.email "foo@bar.com"
f.password "foobar"
f.password_confirmation { |u| u.password }
end
Run Code Online (Sandbox Code Playgroud)
spec_user.rb
describe User do
it "should authenticate with matching username and password" do
user = Factory(:user, :email => 'frank@gmail.com', :password => 'secret')
User.authenticate('frank@gmail.com', 'secret').should == user
end
end
Run Code Online (Sandbox Code Playgroud)
我得到了红灯......
Failure/Error: user = Factory(:user, :email => 'frank@gmail.com', :password => 'secret')
NoMethodError:
undefined method `password_digest=' for #<User:0xb383460>
Run Code Online (Sandbox Code Playgroud)
我认为这是rake db:migrate问题,我查看rails c,但显然定义了password_digest.
ruby-1.9.2-p180 :007 > a = User.new
=> #<User id: nil, email: nil, password_digest: nil, is_admin: nil, created_at: nil, updated_at: nil>
ruby-1.9.2-p180 :008 > a.password_digest = 3
=> 3
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,在以下评论中找到了一个(我认为是)更好的解决方案:
基本上,您需要通过迁移向您的模型添加password_digest字段.在此之前,它将添加一个password_digest =方法,但它不会被保存,并且该方法不会出现在工厂等中