我在我的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
config/initializers/rails_admin.rb
目录下可以吗? - Yuan Hedef update
子句...有了它,它就完美地运作了。谢谢! - Jorge CaballeroDevise提供了一个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维基有关于此方法的更多信息。
#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
<%= 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 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
希望这能帮助到某些人。
it seems
是什么意思?你遇到了验证错误还是其他的问题? - phoet