ActiveAdmin:如何保持用户密码不变?

Luc*_*Luc 27 ruby-on-rails activeadmin

我在我的rails应用程序中使用ActiveAdmin作为我的管理后端.基本上,我有一个admin_user和一个用户模型.

当我从管理员帐户创建新用户时,我指定了电子邮件和密码,这没关系.

假设我想要修改用户的电子邮件而不是密码......似乎无法完成此操作,因为更新用户时密码字段不能为空.

在更新用户时,是否存在可以认为密码未更改的字段(password和password_confirmation)留空的配置?

mau*_*dea 91

您根本不需要使用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
Run Code Online (Sandbox Code Playgroud)

  • 我认为缺少`def update`条款......因此它完美无缺.谢谢! (5认同)
  • 优雅!感谢分享. (2认同)
  • 我在哪里可以找到这个文件?可以把它放在`config/initializers/rails_admin.rb`中吗? (2认同)
  • @JoelCDoyle这属于Model的Active Admin注册,位于app/admin/model.rb中 (2认同)

roc*_*ist 20

update_without_password如果没有输入密码,Devise提供了一种在更新用户时可以使用的方法.使用该方法,您可以在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
Run Code Online (Sandbox Code Playgroud)

如果您感兴趣,Devise Wiki会提供有关此方法的更多信息.


小智 10

您需要在if语句中评估password和password_confirmation,以在"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
Run Code Online (Sandbox Code Playgroud)

这使我只有在创建新用户并更新而不更改其密码时才验证密码存在.

这项工作对我来说,我希望这是有帮助的.

我希望这是有帮助的.