LoginSignup
42
34

More than 5 years have passed since last update.

ActiveAdmin の actions のボタンをカスタマイズする

Posted at

はじめに

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 の場合のみに削除ボタンを非表示するサンプル

app/models/user.rb
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
app/admin/user.rb
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

サンプルコードの説明

actionsdefalts: 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.rbconfig.namespace を変更していると、admin の部分が変更した namespace に変わります。

あとは、css 用に class を追加してしてます。これを指定しないしないと表示が崩れてしまうので、必須。
また、最後の削除ボタンについては、自動で生成されるものには、削除の confirm がでますので、合わせて記載し、
role が admin のものを削除できないよう unless で条件を追加することで表示/非表示を制御しました。

42
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
34