Обновление атрибутов из извлеченных объектов, для которых требуются attr_acessors — Учебное пособие по Rails — Майкла Хартла

#ruby-on-rails #railstutorial.org

#ruby-on-rails #railstutorial.org

Вопрос:

В главе 7 из руководства Майкла Хартла есть модель пользователя <код здесь>, у которой атрибут пароля определен как attr_accessor, а также как attr_accessible с помощью средства проверки присутствия.

Проблема в том, что если я извлекаю существующего пользователя и пытаюсь обновить его электронную почту, ruby выдает исключение, запрашивающее его пароль, и я вынужден заново устанавливать пароль каждый раз, когда я хочу обновить любой другой атрибут. Пример:

 User.first.update_attributes!(:email => "example@mail.com")
ActiveRecord::RecordInvalid: Validation failed: Password can't be blank, Password is too short (minimum is 6 characters)
  

Я добавил «: on => :create» рядом с средством проверки наличия пароля, и это, казалось, решило проблему. Является ли это правильным решением в отношении системы входа в систему?

Любой, кто прошел руководство Майкла Харлта, знает, было ли это ошибкой или это было его реальное намерение?

Ответ №1:

Вы хотите добавить средство проверки в поле хэша пароля, чтобы проверялся фактический пароль, хранящийся в базе данных. Если вы заставите password= функцию установить значение столбца хэша, то этот метод будет работать независимо от фактической виртуальной переменной password.

Комментарии:

1. Это могло бы сработать, но я также хочу убедиться, что пользователь заполняет поле пароля на этапе создания, вот почему я добавил средство проверки наличия для пароля (виртуального).

2. Если вы создадите средство проверки для поля password_hash, то оно будет работать, потому что password = обновит этот столбец.