另一种方法可能是从该表单中删除密码和密码确认字段并创建“更改密码”操作,甚至可能是“我的帐户”页面,您可以在其中更改密码。
第三种方法可能是仅在您编辑“自己”时显示密码字段,如下所示:
ActiveAdmin.register AdminUser do
index do
column :email
column :current_sign_in_at
column :last_sign_in_at
column :sign_in_count
default_actions
end
filter :email
form do |f|
f.inputs "Admin Details" do
f.input :email
if(f.object == current_admin_user)
f.input :password
f.input :password_confirmation
end
end
f.actions
end
end
未经测试,但它应该工作。
更新
如果您希望某个特定用户能够像您在问题评论中建议的那样更新所有其他用户的密码,您可以考虑这样做:
form do |f|
f.inputs "Admin Details" do
f.input :email
if(current_admin_user.is_super_admin?)
f.input :password
f.input :password_confirmation
end
end
f.actions
end
is_super_admin?
可以引用布尔值,is_super_admin
也可以是模型中的方法,具体取决于role
字段:
# role :string(255)
class AdminUser < ActiveRecord::Base
ROLES = ['normal', 'super']
SUPER_ROLE = 'super'
def is_super_admin?
role == SUPER_ROLE
end
end
更新 2
您确实还希望防止用户更改帖子参数以更改其他人的密码。同样,有选项 1,在控制器中进行。我对 ActiveAdmin 的了解很浅,所以也许有更好的方法,但这应该可行:
ActiveAdmin.register AdminUser do
controller do
def create
params.delete(:password)
params.delete(:password_confirmation)
super
end
end
end
另一个(更优雅的)解决方案是确保您的 AdminUsers 的密码不能通过批量分配来更改。这种逻辑将进入模型:
class AdminUser < ActiveRecord::Base
attr_accessible :login, :name, :email # .. and everything else you need to be able to edit through a normal form, but NOT password and password_confirmation
end
然后,您可能希望创建自己的change_password
方法,供个人用户更改密码。在保存该表单的控制器操作中,您将执行以下操作:
def submit_change_password
@admin_user = current_admin_user
@admin_user.password = params[:password]
@admin_user.password_confirmation = params[:password_confirmation]
if @admin_user.save
..
else
..
end
end
这样他们就只能更改自己的密码。