Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveAdmin:如何保持用户密码不变?_Ruby On Rails_Activeadmin - Fatal编程技术网

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

Ruby on rails ActiveAdmin:如何保持用户密码不变?,ruby-on-rails,activeadmin,Ruby On Rails,Activeadmin,我在rails应用程序中将ActiveAdmin用作我的管理后端。基本上,我有一个管理员用户和一个用户模型 当我从管理员帐户创建一个新用户时,我会指定一封电子邮件和一个密码,这是可以的 假设我想修改用户的电子邮件,但不想修改密码。。。这似乎无法完成,因为更新用户时密码字段不能为空 是否有一个配置会考虑密码不变,字段(密码和密码确认)在更新用户时是空白的吗? < P>提供了一个 UpDeaTyOutUpHouth< >方法,如果没有输入密码,则可以在更新用户时使用该方法。使用该方法,您可以在Ac

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

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

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


是否有一个配置会考虑密码不变,字段(密码和密码确认)在更新用户时是空白的吗?

< P>提供了一个<代码> UpDeaTyOutUpHouth< <代码> >方法,如果没有输入密码,则可以在更新用户时使用该方法。使用该方法,您可以在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

如果您感兴趣,将提供有关此方法的更多信息。

您根本不需要使用Desive的注册控制器,您可以忽略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
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

您需要在if语句中评估password和password\u confirmation,以便对“password\u confirmation”应用验证,例如对于我的情况:

#app/admin/user.rb
控制器do
def更新
如果参数[:用户][:密码]。为空?&&参数[:用户][:密码\确认]。为空?
参数[:用户]。删除(“密码”)
参数[:用户]。删除(“密码确认”)
结束
超级的
结束
结束
#app/model/user.rb
验证:姓名、电子邮件、状态:真
验证:password、:password\u confirmation、presence:true、on::create
验证:密码,确认:true
这允许我仅在创建新用户并更新时验证密码是否存在,而无需更改其密码

这项工作对我来说,我希望这是有益的


我希望这会有所帮助。

正如@mauriceomdea答案上的评论所述,def更新缺失(或者至少对我来说缺失了,这是一个错误。)

以下是一个更完整的版本,对我很有用:


你根本不需要搞乱Desive的注册控制器,你可以忽略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
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

希望这对其他人有所帮助。

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







****

****
您是否使用Desive进行身份验证?它似乎是什么意思?你有验证错误吗?是的,我用Desive。“似乎”意味着我没有找到这样做的方法,因为密码字段不能为空。优雅!谢谢分享。我在哪里可以找到这个文件?是否可以将其放入
config/initializers/rails_admin.rb
?@JoelCDoyle这属于模型的活动管理员注册,将在app/admin/Model中。rb@YuanHe这属于模型的活动管理员注册,即在app/Admin/Model.rbI中。我认为
def update
子句缺失。。。有了这些,它就完美地工作了。谢谢是的,这是另一种方法