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

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

{"name"=>"Joe User", "email"=>"user@example.com"}

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

Когда я звоню

@user.update_attributes(params[:user])

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

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

Спасибо.

20
задан Sanjay 22 August 2010 в 18:42
поделиться

4 ответа

Мое приложение делает что-то вроде этого

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, чтобы проверка произошла, и вам не нужно делать это при создании.

Который я нашел на хорошем рельсовом канале по адресу http://railscasts.com/episodes/41-conditional-validations

28
ответ дан 30 November 2019 в 00:35
поделиться

Использование update_attributes не изменит значение пароля, если в хэше params нет ключа для него.

Проверка не выполняется только для измененных полей. Он также проверяет существующие значения.

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

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

1
ответ дан 30 November 2019 в 00:35
поделиться

В вашей пользовательской модели вы можете просто игнорировать проверку пароля, если она не установлена.

validates_length_of :password, :minimum => N, :unless => lambda {|u| u.password.nil? }
1
ответ дан 30 November 2019 в 00:35
поделиться

Приложение, над которым я работаю, использует следующее:

    validates_confirmation_of :password, 
                              :if => Proc.new { |account| 
                                                !account.password.blank? 
                                                || !account.password_confirmation.blank? 
                                                || account.new_record? }

В зависимости от ваших требований, вы можете удалить new_record? чек

0
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: