ActiveAdmin:如何不更改用户密码?

29

我在我的Rails应用程序中使用ActiveAdmin作为我的管理后台。基本上,我有一个admin_user和一个user模型。

当我从管理员账户创建一个新用户时,我指定了一个电子邮件和一个密码,这是可以的。

假设我现在想要修改用户的电子邮件地址,但不更改密码...似乎这是不可能的,因为在更新用户时密码字段不能为空。

是否有一个配置可以使得在更新用户时,如果将(密码和确认密码)字段留空,则认为密码未更改?


你是否在使用Devise进行身份验证? - Muhamamd Awais
it seems 是什么意思?你遇到了验证错误还是其他的问题? - phoet
是的,我使用Devise。 “似乎”意味着我没有找到方法来做到这一点,因为密码字段不能为空。 - Luc
5个回答

98

你不需要与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

2
我在哪里可以找到这个文件?把它放在 config/initializers/rails_admin.rb 目录下可以吗? - Yuan He
2
@JoelCDoyle 这应该放在 Model 的 Active Admin 注册中,即在 app/admin/model.rb 中。 - Alexander Presber
1
@YuanHe 这段代码应该放在 Active Admin 的 Model 注册中,即位于 app/admin/model.rb 文件中。 - Alexander Presber
5
我认为缺少def update子句...有了它,它就完美地运作了。谢谢! - Jorge Caballero
谢谢。工作得很好。 - djalmaaraujo

22

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维基有关于此方法的更多信息。


是的,这里还有另一种方法可以做到 https://dev59.com/vG435IYBdhLWcg3w9FHi#11676957 - Yuan He

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

这使我能够在创建新用户并更新而不更改密码时仅验证密码的存在。

对我有用,希望对您有所帮助。

希望这对您有所帮助。


1

您只能在创建时验证密码,因为在更新时,bcrypt 仍将验证密码是否存在。

class User
   validate :password, :password_confirmation, presence: true, on: :create 
end

在我看来,这种方法更加简单且没有风险,并且允许您使用单个部分表单来创建和更新路由,使用if语句来显示/隐藏密码输入字段,就像这样:
<%= form_for(user, url: users_path) do |form| %>
<%= form.label 'Name' %><br>
<%= form.text_field :name%><br>

<%= form.label 'email' %><br>
<%= form.text_field :email%><br>

<%= form.label 'Password' %><br>
<%= form.password_field :password%><br>

**<% if form.object.new_record? %>**
    <%= form.label 'password_confirmation' %><br>
    <%= form.password_field :password_confirmation%><br>
**<% end %>**

<%= form.submit (form.object.new_record? ? 'create' : 'update')  %>

0

根据@mauriceomdea答案中的评论所述,def update缺失(或者至少对我来说是缺失的,导致出现错误)。

这里是一个更完整的版本,适用于我:

您实际上不需要在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

希望这能帮助到某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接