はじめに
ActiveAdmin で管理画面を実装すると、各モデルの CRUD を簡単に用意できるが、
特定の条件の時には、リソースを削除させたくないといった場合には対応できなかったので、
自前でデフォルトのボタンのように実装した際のメモです。
ページ生成後の html と、gem のソースを読んで調べてみました。
actions とは
ActiveAdmin で各リソース毎に CRUD のどの操作を行えるかを定義でき、
新規作成、一覧、更新のページでは、画面に沿った各種ボタンをを出力する
用意されている action 一覧
アクション名 | 詳細 |
---|---|
:index | 一覧画面 |
:show | 詳細画面 |
:new | 作成画面 |
:create | 作成権限 |
:edit | 編集画面 |
:update | 更新権限 |
:destroy | 削除権限 |
下記のように書くと、使用できる権限が、一覧表示、更新のみに限られる
actions :all, except: [:new, :create, :destroy]
サンプルコード
実装内容
User モデルの一覧ページで、User の role が admin の場合のみに削除ボタンを非表示するサンプル
class User < ActiveRecord::Base
extend Enumerize
enumerize :role, in: { user: 1, admin: 2 }, default: :user, predicates: true, scope: true
validates :email, :name, :address, presence: true
end
ActiveAdmin.register User do
index do
column :id
column :name
column :email
actions defaults: false do |user|
item I18n.t('active_admin.view'), admin_user_path(user), class: 'view_link member_link'
item I18n.t('active_admin.edit'), edit_admin_user_path(user), class: 'edit_link member_link'
item I18n.t('active_admin.delete'), admin_user_path(user), class: 'delete_link member_link', method: :delete, data: { confirm: I18n.t('active_admin.delete_confirmation') } unless user.admin?
end
end
# 詳細
show do
default_main_content
end
# 作成/編集
form do |f|
inputs do
input :name
input :email
end
actions
end
permit_params :email, :name
end
サンプルコードの説明
actions
に defalts: false
を指定して、デフォルトで生成されるボタンを生成しないようしてます。
これを指定しないと、デフォで生成されるボタンと自前で作成したボタンとが合わせて表示されてしまいます。
item
は実装するボタン毎に追加し、最初の引数 I18n.t('active_admin.view')
等については、各ボタンで使用されている I18n の辞書ファイルを参照して生成されるリンクの文字列を指定し、次に、path
を記載します。
path
については、ActiveAdmin
で リソースファイル(app/admin/user.rb
等)を作成すると自動で path
が追加され、
その helper
を記載します。
user
リソースを追加すると下記 path
が自動的に追加される
Helper | HTTP Verb | Path | Controller#Action |
---|---|---|---|
batch_action_admin_users_path | POST | /admin/users/batch_action(.:format) | admin/users#batch_action |
admin_users_path | GET | /admin/users(.:format) | admin/users#index |
POST | /admin/users(.:format) | admin/users#create | |
new_admin_user_path | GET | /admin/users/new(.:format) | admin/users#new |
edit_admin_user_path | GET | /admin/users/:id/edit(.:format) | admin/users#edit |
admin_user_path | GET | /admin/users/:id(.:format) | admin/users#show |
PATCH | /admin/users/:id(.:format) | admin/users#update | |
PUT | /admin/users/:id(.:format) | admin/users#update | |
DELETE | /admin/users/:id(.:format) | admin/users#destroy |
※ config/initializers/active_admin.rb
で config.namespace
を変更していると、admin
の部分が変更した namespace
に変わります。
あとは、css 用に class を追加してしてます。これを指定しないしないと表示が崩れてしまうので、必須。
また、最後の削除ボタンについては、自動で生成されるものには、削除の confirm がでますので、合わせて記載し、
role が admin のものを削除できないよう unless で条件を追加することで表示/非表示を制御しました。