Тесты RSpec не проходят с «неизвестным атрибутом»

Я тестирую ответ атрибута в своей модели:

it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }

Эти атрибуты не являются частью базы данных, а просто объявлены в моей модели как attr_accessible. Когда я не объявляю их и не запускаю свои тесты, я получаю:

ActiveModel::MassAssignmentSecurity::Error:
  Can't mass-assign protected attributes: password, password_confirmation

Но после того, как я объявлю их, я получаю:

ActiveRecord::UnknownAttributeError:
  unknown attribute: password

Любая идея, почему это происходит?


person 8vius    schedule 19.08.2012    source источник
comment
вы выбрали неправильный ответ как правильный =/   -  person    schedule 02.03.2013


Ответы (2)


@8vius, потому что вы следуете руководству, но недостаточно внимательно. Вам нужно добавить строку:

has_secure_password

ниже attr_accessible :email, :name, :role, :password, :password_confirmation

это позволяет вам сохранить простой текстовый пароль и пароль_подтверждение в памяти, чтобы вы могли сравнивать строки и обеспечивать равенство перед шифрованием и сохранением в БД. Вы не хотите сохранять пароль в виде простого текста в БД.

person Mike Simmons    schedule 13.11.2012
comment
ваш ответ должен быть выбран - person ; 02.03.2013

attr_accessible сообщает Rails, что вы разрешаете так называемое массовое присвоение атрибутов.

Но атрибуты должны существовать в БД, или вы должны создать геттер/сеттер, самый простой способ:

attr_accessor :password_confirmation, :password

В любом случае, звучит странно, что вы не храните пароль.

person apneadiving    schedule 19.08.2012
comment
Я сохраняю его, но это не атрибут, я следую руководству ruby.railstutorial.org - person 8vius; 19.08.2012
comment
Только что взглянул, кажется, отсутствует объявление attr_accessor - person apneadiving; 19.08.2012
comment
Да, это так, теперь это работает, он, должно быть, по какой-то причине пропустил это в учебнике по ошибке. - person 8vius; 19.08.2012
comment
Видите ли, это одна из тех вещей, которые не объясняются должным образом (я думаю) в большинстве книг и руководств. Спасибо за ответ! Я не знал, что attr_accessible будет работать только для переменных, которые уже есть в базе данных. Я думал, что это комбинированный геттер/сеттер для классов в Rails, который был немного синтаксическим сахаром! - person tentimes; 24.09.2012
comment
@8vius внимательно прочитайте другой ответ, чтобы понять, что на самом деле происходит с этой проблемой. Я знаю, что это уже решено, но проверять неправильный ответ нехорошо для будущих посетителей ;) В учебнике у вас есть четкое объяснение этого: ruby.railstutorial.org/chapters/ - person ; 02.03.2013