web-dev-qa-db-ja.com

ActiveAdmin:ユーザーパスワードを変更しないようにする方法は?

Railsアプリで管理バックエンドとしてActiveAdminを使用しています。基本的に、admin_userおよびuserモデル。

管理者アカウントから新しいユーザーを作成するときは、メールアドレスとパスワードを指定します。これで問題ありません。

次に、ユーザーの電子メールを変更したいが、パスワードは変更したくないとしましょう...ユーザーを更新するときにパスワードフィールドを空白にすることはできないため、これはできないようです。

ユーザーの更新中にフィールド(passwordとpassword_confirmation)が空白のままになっていると、パスワードが変更されていないと見なす構成はどこかにありますか?

28
Luc

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 に興味があれば、このメソッドに関する詳細情報があります。

20

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
91
mauriciomdea

「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

これにより、新しいユーザーを作成してパスワードを変更せずに更新した場合にのみ、パスワードの存在を検証できます。

これは私にとってはうまくいきます。これがお役に立てば幸いです。

これがお役に立てば幸いです。

10
calrrox

@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

これが誰かに役立つことを願っています。

0