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

时间:2013-03-08 10:50:38

标签: ruby-on-rails activeadmin

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

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

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

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

5 个答案:

答案 0 :(得分:90)

你真的不需要使用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

答案 1 :(得分:20)

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 :(得分: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

这允许我仅在创建新用户并更新而不更改其密码时验证密码存在。

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

我希望这有用。

答案 3 :(得分: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')  %>
    

答案 4 :(得分:0)

如对@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

希望这对某人有帮助。