Railsアプリで管理バックエンドとしてActiveAdminを使用しています。基本的に、admin_user
およびuser
モデル。
管理者アカウントから新しいユーザーを作成するときは、メールアドレスとパスワードを指定します。これで問題ありません。
次に、ユーザーの電子メールを変更したいが、パスワードは変更したくないとしましょう...ユーザーを更新するときにパスワードフィールドを空白にすることはできないため、これはできないようです。
ユーザーの更新中にフィールド(passwordとpassword_confirmation)が空白のままになっていると、パスワードが変更されていないと見なす構成はどこかにありますか?
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 に興味があれば、このメソッドに関する詳細情報があります。
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
「password_confirmation」に検証を適用するには、ifステートメントでpasswordと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
これにより、新しいユーザーを作成してパスワードを変更せずに更新した場合にのみ、パスワードの存在を検証できます。
これは私にとってはうまくいきます。これがお役に立てば幸いです。
これがお役に立てば幸いです。
@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
これが誰かに役立つことを願っています。