マスタ管理機能を楽に実装できるActiveAdminに関する記事です。
以前ActiveAdminで簡単な管理ツールを作っていたのですが、そのときにログインユーザーの権限毎に実行できるアクションを制限したいと考えました。その際にshowのデフォルトaction itemsがどうしても消せずに困ったので記事にしておきます。
ユーザー権限によって実行できるアクションを限定する
この手の情報は既に多くの記事が存在するのでここでは詳述しません。
Userテーブルへのカラム追加
まずは下記を参考に、Userテーブルにroleカラムを追加します。
cancanを使わずにactive_adminの管理画面で、current_userの権限によるviewの出し分けをする - Qiita
これで、admin_current_user.role
で、ログインユーザーの権限を取得することができます。あとは煮るなり焼くなりご自由に・・・ということで、早速実装してみました。
index
まずはindexに権限振り分けを設定します。ここでは、roleがadminのアカウントでログインしたユーザーのみレコードの「削除」を行えるようにしています。
index do
actions defaults: false do |daily|
item '閲覧', admin_daily_path(daily), class: 'view_link member_link'
item '編集', edit_admin_daily_path(daily), class: 'edit_link member_link'
item '削除', admin_daily_path(daily), class: 'delete_link member_link', method: :delete, data: { confirm: '本当に削除しますか?' } if current_admin_user.role == 'admin'
end
end
いいカンジ。
show
では、次にshow行ってみましょう。
indexと同様、Adminユーザーのみ削除を許可します。
action_item :only => :show do
link_to('日報(実績)を編集する', edit_admin_daily_path(daily))
end
action_item :only => :show do
link_to('日報(実績)を削除する', admin_daily_path(daily), method: :delete, data: { confirm: '本当に削除しますか?' }) if current_admin_user.role == 'admin'
end
action_item :only => :index do
link_to('日報(実績)を作成する', new_admin_daily_path)
end
うーん、なんか同じようなボタンがいくつかありますね。
どうやらデフォルトのaction itemsが表示されているみたいです。
どうすればデフォルトのaction itemsがクリアできるのかわからず、結構悩みました。
indexで指定するときはactions defaults: false
で済んだんですが・・・。
その結果、以下に答えがありました。
Editing/Removing Action Items? · Issue #760 · activeadmin/activeadmin · GitHub
config.clear_action_items!
を指定すると、action itemsがクリアされるみたいですね。
早速修正して実行してみます。
めでたしめでたし。