Я добавил проверку пароля в свою модель User
:
validates :password, presence: true
validates :password, confirmation: { case_sensitive: true }
но затем, когда я хотел обновить другие поля в users
, эти проверки делали транзакцию недействительной, поскольку password
отсутствовал.
Проведя небольшое исследование, я понял, что могу пропустить эти проверки, если password
отсутствует:
validates :password, presence: true, if: :validate_password?
validates :password, confirmation: { case_sensitive: true }, if: :validate_password?
def validate_password?
password.present? || password_confirmation.present?
end
Однако теперь, когда я отправляю пустой пароль и подтверждение пароля, validate_password?
возвращает false
. Я не очень понимаю, что происходит, потому что
@user.update_attributes(password_reset_edit_params)
возвращает true
где
password_reset_edit_params
is <ActionController::Parameters {"password"=>"", "password_confirmation"=>""} permitted: true>
но внутри
def validate_password?
password.present? || password_confirmation.present?
end
password
и password_confirmation
оцениваются как nil
, а мой пароль @user
не обновляется до пустой строки.
Я должен упомянуть, что я использую Bcrypt, и @user.password
на самом деле всегда будет оцениваться как nil
, тогда как доступно password_digest
.
Итак, каково решение? В конечном счете, я думаю, мой вопрос просто:
Как можно игнорировать проверки пароля, когда я не пытаюсь отправить пароль, но также разрешать эти проверки при отправке пустой строки?
Мне пришло в голову, что я мог бы добавить условие в контроллер, которое не позволяет передавать пустые строки, но должен быть изящный способ решить эту проблему.
Любая помощь очень ценится. Спасибо!
, if: :validate_password?
из проверки. - person Aleksei Matiushkin   schedule 22.03.2019User
(сpassword
или без него), запускается проверка, и если я пытаюсь обновить пользователя без ввода пароля, проверка возвращает ошибку. - person Josh Kestenberg   schedule 22.03.2019