ActiveAdmin: как оставить пароль пользователя без изменений?
Я использую ActiveAdmin в качестве моего бэкэнда для администрирования в своем приложении rails. В принципе, у меня есть admin_user и пользовательская модель.
Когда я создаю нового пользователя из учетной записи администратора, я указываю адрес электронной почты и пароль, это нормально.
Скажем, я хочу изменить адрес электронной почты пользователя, но не пароль... кажется, это невозможно сделать, поскольку поле пароля не может быть пустым при обновлении пользователя.
Есть ли где-то конфигурация, которая учитывала бы, что пароль не изменяется, являются ли поля (пароль и пароль_конфигурация) пустыми при обновлении пользователя?
Ответы
Ответ 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
надеюсь, это поможет кому-то.