我在我的 rails 应用程序中使用 ActiveAdmin 作为我的管理后端。基本上,我有一个admin_user
和一个user
模型。
当我从管理员帐户创建新用户时,我指定了电子邮件和密码,没关系。
假设我想修改用户的电子邮件而不是密码……这似乎无法完成,因为更新用户时密码字段不能为空。
是否有配置认为密码未更改是在更新用户时将字段(密码和密码确认)留空?
我在我的 rails 应用程序中使用 ActiveAdmin 作为我的管理后端。基本上,我有一个admin_user
和一个user
模型。
当我从管理员帐户创建新用户时,我指定了电子邮件和密码,没关系。
假设我想修改用户的电子邮件而不是密码……这似乎无法完成,因为更新用户时密码字段不能为空。
是否有配置认为密码未更改是在更新用户时将字段(密码和密码确认)留空?
你根本不需要弄乱 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
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会提供有关此方法的更多信息。
您需要在 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
这允许我仅在创建新用户并在不更改其密码的情况下进行更新时验证密码是否存在。
这项工作对我来说,我希望这会有所帮助。
我希望这是有帮助的。
您只能在创建时验证密码,因为更新时 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') %>
正如@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
希望这可以帮助某人。