2012-01-06 3 views
2

Я пытаюсь использовать has_secure_password в моей модели пользователя, но обнаружил, что, пока он работает в приложении, он прерывает все мои тесты. У меня есть простая модель пользователя:Создание пользователей с has_secure_password

class User < ActiveRecord::Base 
    has_secure_password 
    attr_accessible :email 

    validates :email, :presence => true, 
       :format => { :with => /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i }, 
       :uniqueness => { :case_sensitive => false } 
    validates :password, :presence => true 
end 

Моего первый тест (RSpec) просто подтверждает, что я могу создать новый пользователь с действительными атрибутами:

describe User do 
    before(:each) do 
     @attr = { :forename => "Captain", 
        :surname => "Hook", 
        :email => "[email protected]", 
        :password => "password", 
        :password_confirmation => "password" } 
    end 

    it "should create a new instance given valid attributes" do 
     User.create!(@attr) 
    end 
end 

Это не работает, однако, когда я делаю

user = User.new(@attr); 
user.password = "password"; 
user.save 

все нормально работает. Я считаю, что это связано с тем, что has_secure_password добавляет новый метод, пароль, который имеет дело с генерацией password_digest, поэтому его прямое обращение генерирует нужные мне поля. Есть ли способ использовать User.create, но все же вызывать этот метод?

ответ

1

Оказывается, проблема была очень простой. Поскольку я не добавил: пароль для attr_accessible, он не заполнял поле, когда я звонил User.create или User.new. Единственное изменение, которое мне нужно было сделать, чтобы код был

attr_accessible :email, :password 
+3

'attr_accessible: электронная почта,: пароль: password_confirmation' –

+3

Как вы это в Rails 4? Я спрашиваю, потому что в Rails 4 больше нет attr_accessible. –

+1

Вместо этого вы должны использовать 'attr_accessor'. –

Смежные вопросы