もう1つの方法は、このフォームからpasswordフィールドとpassword_confirmationフィールドを削除して、「パスワードの変更」アクションを作成するか、パスワードを変更できる「マイアカウント」ページを作成することです。
3番目の方法は、次のように、「自分」を編集しているときにのみパスワードフィールドを表示することです。
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
テストされていませんが、動作するはずです。
更新
質問へのコメントで提案したように、特定の1人のユーザーが他のすべてのユーザーのパスワードを更新できるようにする場合は、次のことを検討できます。
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
Update 2
確かに、ユーザーが投稿パラメーターを変更して他のユーザーのパスワードを変更できないようにする必要があります。繰り返しますが、オプション1があり、コントローラーで実行します。私はActiveAdminについての知識が浅いので、もっと良い方法があるかもしれませんが、これはうまくいくはずです:
ActiveAdmin.register AdminUser do
controller do
def create
params.delete(:password)
params.delete(:password_confirmation)
super
end
end
end
もう1つの(より洗練された)解決策は、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
このように、彼らは自分のパスワードのみを変更することができます。