Подтвердить что ты не робот

В Rails 3, как я могу пропустить проверку поля пароля, когда я не пытаюсь обновить пароль?

Моя модель пользователя содержит: имя,: адрес электронной почты и поля пароля. Все 3 имеют проверки длины. Веб-страница "Обновить учетную запись" позволяет пользователю обновлять свое имя и адрес электронной почты, но не пароль. Когда отправлено, params [: user]

{"name"=>"Joe User", "email"=>"[email protected]"}

Обратите внимание, что ключ "пароль" отсутствует, поскольку форма не содержит такого поля ввода.

Когда я звоню

@user.update_attributes(params[:user])

проверка пароля не выполняется. Однако, поскольку я не пытаюсь обновить пароль, я не хочу, чтобы проверка пароля выполнялась в этом обновлении. Я смущен, почему проверка пароля выполняется, когда params [: user] не содержит ключа "password".

Обратите внимание, что я хочу иметь отдельную веб-страницу в другом месте, которая позволяет пользователю обновлять свой пароль. И для этого представления проверка пароля должна выполняться.

Спасибо.

4b9b3361

Ответ 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**