【问题标题】:ActiveAdmin: how to leave user password unchanged?ActiveAdmin:如何保持用户密码不变?
【发布时间】:2013-03-08 10:50:37
【问题描述】:

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

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

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

是否存在会认为密码未更改的配置是在更新用户时将字段(密码和密码确认)留空?

【问题讨论】:

  • 您是否使用设备进行身份验证?
  • it seems 是什么意思?你得到验证错误,还是什么?
  • 是的,我使用设计。 “似乎”意味着我没有找到方法,因为密码字段不能留空。

标签: ruby-on-rails activeadmin


【解决方案1】:

你根本不需要弄乱 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

【讨论】:

  • 优雅!感谢分享。
  • 我在哪里可以找到这个文件?可以放在config/initializers/rails_admin.rb 中吗?
  • @JoelCDoyle 这属于 Model 的 Active Admin 注册,在 app/admin/model.rb 中
  • @YuanHe 这属于Model的Active Admin注册,在app/admin/model.rb中
  • 我认为缺少def update 子句......这样它就可以完美地工作了。谢谢!
【解决方案2】:

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

【讨论】:

【解决方案3】:

您需要在 if 语句中评估密码和密码确认,以对“密码确认”应用验证,例如对于我的情况:

#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

这允许我仅在创建新用户并在不更改密码的情况下进行更新时验证密码是否存在。

这对我有用,希望对你有帮助。

我希望这会有所帮助。

【讨论】:

    【解决方案4】:

    您只能在创建时验证密码,因为更新时 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')  %>
    

    【讨论】:

      【解决方案5】:

      正如@mauriceomdea 答案中的 cmets 所述,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
      

      希望这对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 2019-06-14
        • 1970-01-01
        • 2013-05-12
        • 2019-01-15
        • 2011-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多