Текущий пароль не может быть пустым при обновлении учетной записи devise

Я использую devise и хочу разрешить пользователю обновлять свою учетную запись (адрес электронной почты и пароль). Поэтому, когда я нажимаю edit_user_registration_path, я получаю страницу, на которой пользователь может изменить свой адрес электронной почты и пароль. Но при отправке этой update формы я постоянно получаю это сообщение:

1 error prohibited this user from being saved: ×
Current password can't be blank

в моем ApplicationController у меня есть

def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :surname, :email, :user_name, :terms_of_service, :password, :password_confirmation) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation) }
end

Кто-нибудь может это объяснить?


person user1611830    schedule 18.12.2013    source источник
comment
возможный дубликат Разработать пользователя обновления без пароля   -  person zrl3dx    schedule 18.12.2013


Ответы (4)


По умолчанию в Devise есть три поля пароля на edit_user_registration: password, password_confirmation и current_password: регистрации по умолчанию / edit.html.erb

current_password требуется для любого изменения; два других можно оставить пустыми, если пароль менять не предполагается.

person janfoeh    schedule 18.12.2013
comment
После добавления поля current_password я получаю следующее сообщение: undefined local variable or method unconfirmed_email. Откуда эта ошибка? - person user1611830; 18.12.2013
comment
@ user1611830 где именно возникает ошибка? Какой файл, какая строка? - person janfoeh; 18.12.2013
comment
в этом файле method_missing(gem) activemodel-4.0.0/lib/active_model/attribute_methods.rb в method_missing методе match ? attribute_missing(match, *args, &block) : super - person user1611830; 18.12.2013
comment
@ user1611830, пожалуйста, обновите свой вопрос новой проблемой и добавьте полную трассировку стека, а также свое представление редактирования. - person janfoeh; 18.12.2013
comment
хорошо, я поймал это, у меня было :confirmable в моей пользовательской модели устройства! Я удалил, и все прошло нормально! - person user1611830; 18.12.2013

Поместите этот код в свою модель пользователя:

def update_with_password(params, *options)
    current_password = params.delete(:current_password)

    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end

    result = if params[:password].blank? || valid_password?(current_password)
      update_attributes(params, *options)
    else
      self.assign_attributes(params, *options)
      self.valid?
      self.errors.add(:current_password, current_password.blank? ? :blank : :invalid)
      false
    end

    clean_up_passwords
    result
end
person Aathi    schedule 22.09.2015
comment
Правильно ли притворяться, что внутри модели params? Я думал, они были просто в контексте контроллеров. - person Pioneer Skies; 17.12.2015
comment
@PioneerSkies Все в порядке, и этот ответ решил мою проблему. - person Aboozar Rajabi; 08.04.2016

По умолчанию devise требует пароль для обновления пользователя.

Вот страница с инструкциями officail по изменению этого поведения: https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password

person zinovyev    schedule 12.03.2017

Не знаю, есть ли у вас решение, но вы можете сделать простую вещь:

Создайте user_controller, а затем создайте user_params с паролем и password_confirmation и еще один (я использовал это имя: user_params_without_password) без пароля и password_confirmation.

И в своем обновлении вы проверите, присутствует ли пароль, да, вы будете использовать user_params, если нет, user_params_without_password.

Вот код:

def update

    if params[:user][:password].present?
      params = user_params
    else
      params = user_params_without_password
    end

def user_params
      params.require(:user).permit( params...

def user_params_without_password
  params.require(:user).permit( params without password

Надеюсь, эта подсказка вам поможет :)

person Mario Augusto    schedule 24.01.2017