ActiveModel :: SecurePassword неопределенный метод `password_digest = ' - PullRequest
2 голосов
/ 20 мая 2011

Я пытаюсь использовать rails 3.1 ActiveModel :: SecurePassword, выполнив http://bcardarella.com/post/4668842452/exploring-rails-3-1-activemodel-securepassword

, и в результате я получаю красный свет ...

user.rb

class User < ActiveRecord::Base
  has_secure_password
  validates :password, :presence => { :on => :create }
end

factory.rb

Factory.define :user do |f|
  f.email "foo@bar.com"
  f.password "foobar"
  f.password_confirmation { |u| u.password }  
end

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

и я получил красный свет ...

 Failure/Error: user = Factory(:user, :email => 'frank@gmail.com', :password => 'secret')
 NoMethodError:
   undefined method `password_digest=' for #<User:0xb383460>

и я подумал, что это граблиdb: проблема с миграцией, и я смотрю на рельсы 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 

Ответы [ 2 ]

6 голосов
/ 24 ноября 2011

У меня возникла та же проблема, и я нашел (как мне кажется,) лучшее решение в следующем комментарии:

http://bcardarella.com/post/4668842452/exploring-rails-3-1-activemodel-securepassword#comment-281584959

в основном вам нужно добавить password_digestполе для вашей модели с миграцией.До этого он добавит метод password_digest =, но он не будет сохранен, и метод не будет отображаться на фабриках и т.п.

1 голос
/ 20 мая 2011

решено

describe User do
  it "should authenticate with matching username and password" do
    user = Factory(:user, :email => 'frank@gmail.com', :password => 'secret')
    User.find_by_email('frank@gmail.com').try(:authenticate, 'secret').should == user
  end
end
...