В Rails 3, как я могу пропустить проверку поля пароля, когда я не пытаюсь обновить пароль?
Моя модель пользователя содержит: имя,: адрес электронной почты и поля пароля. Все 3 имеют проверки длины. Веб-страница "Обновить учетную запись" позволяет пользователю обновлять свое имя и адрес электронной почты, но не пароль. Когда отправлено, params [: user]
{"name"=>"Joe User", "email"=>"[email protected]"}
Обратите внимание, что ключ "пароль" отсутствует, поскольку форма не содержит такого поля ввода.
Когда я звоню
@user.update_attributes(params[:user])
проверка пароля не выполняется. Однако, поскольку я не пытаюсь обновить пароль, я не хочу, чтобы проверка пароля выполнялась в этом обновлении. Я смущен, почему проверка пароля выполняется, когда params [: user] не содержит ключа "password".
Обратите внимание, что я хочу иметь отдельную веб-страницу в другом месте, которая позволяет пользователю обновлять свой пароль. И для этого представления проверка пароля должна выполняться.
Спасибо.
Ответы
Ответ 1
Мое приложение делает что-то вроде этого
attr_accessor :updating_password
validates_confirmation_of :password, :if => should_validate_password?
def should_validate_password?
updating_password || new_record?
end
поэтому вам нужно model.updating_password = true
выполнить проверку, и вам не нужно делать это при создании.
Что я нашел в хорошем railscast на http://railscasts.com/episodes/41-conditional-validations
Ответ 2
В вашей модели пользователя вы можете просто игнорировать проверку пароля, если она не установлена.
validates_length_of :password, :minimum => N, :unless => lambda {|u| u.password.nil? }
Ответ 3
Использование update_attributes
не изменит значение пароля, если в хеше params нет ключа для него.
Валидация не выполняется только для измененных полей. Он также проверяет существующие значения.
Ваша проверка должна быть неудачной, поскольку в поле пароля содержится некорректный контент, который уже сохранен в базе данных. Я предполагаю, что это возможно потому, что вы хэшируете его после проверки, и вы пытаетесь проверить хешированную строку.
Вы можете использовать виртуальный атрибут (переменную или метод экземпляра), который вы проверяете с помощью настраиваемого метода, а затем назначьте хэш в поле сохраненного пароля. Посмотрите этот метод для идей.
Ответ 4
В приложении, которое я работаю, используется следующее:
validates_confirmation_of :password,
:if => Proc.new { |account|
!account.password.blank?
|| !account.password_confirmation.blank?
|| account.new_record? }
В зависимости от ваших требований вы можете удалить new_record? проверить
Ответ 5
When password is added then only confirmation will be called and presence will call on create action only
**validates_presence_of :password, :on =>:create**
**validates_confirmation_of :password**