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

ActiveAdmin: как оставить пароль пользователя без изменений?

Я использую ActiveAdmin в качестве моего бэкэнда для администрирования в своем приложении rails. В принципе, у меня есть admin_user и пользовательская модель.

Когда я создаю нового пользователя из учетной записи администратора, я указываю адрес электронной почты и пароль, это нормально.

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

Есть ли где-то конфигурация, которая учитывала бы, что пароль не изменяется, являются ли поля (пароль и пароль_конфигурация) пустыми при обновлении пользователя?

4b9b3361

Ответ 1

Devise предоставляет метод update_without_password, который можно использовать при обновлении пользователя, если пароль не введен. Используя этот метод, вы можете настроить метод обновления в своем контроллере пользователей ActiveAdmin.

 def update
   @user = User.find(params[:id])
   if params[:user][:password].blank?
     @user.update_without_password(params[:user])
   else
     @user.update_attributes(params[:user])
   end
   if @user.errors.blank?
     redirect_to admin_users_path, :notice => "User updated successfully."
   else
     render :edit
   end
 end

Devise Wiki содержит дополнительную информацию об этом методе, если вы заинтересованы.

Ответ 2

Вам не нужно вообще путаться с контроллером регистрации Devise, вы можете просто игнорировать пустые поля пароля внутри контроллера ресурсов ActiveAdmin:

ActiveAdmin.register User do

  controller do

    model = :user

    if params[model][:password].blank?
      %w(password password_confirmation).each { |p| params[model].delete(p) }
    end

    super

  end

end

Ответ 3

Вам нужно оценить пароль и пароль_конфигурации в инструкции if, чтобы применить проверки на "password_confirmation", например, для моего случая:

#app/admin/user.rb
controller do
  def update
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank?
      params[:user].delete("password")
      params[:user].delete("password_confirmation")
    end
    super
  end
end


#app/model/user.rb
validates :name, :email, presence: true
validates :password, :password_confirmation, presence: true, on: :create
validates :password, confirmation: true

Это позволяет мне проверять присутствие паролей только при создании нового пользователя и обновлении без изменения его пароля.

Эта работа для меня, надеюсь, это будет полезно.

Я надеюсь, что это будет полезно.

Ответ 4

Как сказано в комментариях к ответу @mauriceomdea, обновление def отсутствует (или, по крайней мере, отсутствовало для меня, из-за ошибки.)

Вот более полная версия, которая работала для меня:

Вам вообще не нужно связываться с контроллером регистрации Devise, вы можете просто игнорировать пустые поля пароля внутри контроллера ресурсов ActiveAdmin:

ActiveAdmin.register User do

  controller do  
    def update
      model = :user

      if params[model][:password].blank?
        %w(password password_confirmation).each { |p| params[model].delete(p) }
      end

      super
    end
  end
end

надеюсь, это поможет кому-то.