0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ActiveAdminのアクション追加例3パターン

Posted at

はじめに

ActiveAdminで開発を進めていると独自アクションを追加したいケースがあります。
本記事ではよく使うアクションの追加例を3パターン紹介します。

アクションとは

Railsのコントローラに記述する#index, #show, #new, #create, #edit, #update, #destroyなどのことです。

どのような時にアクションを追加するのか

ActiveAdminでは普段使用する7種類のアクションを用意してくれますが、例えば「全ユーザを一括で更新したい」といった処理はもちろん自分でアクションを書く必要があります。
通常のRailsコントローラならroutes.rbにmemberやcollectionを書けばよいのですが、ActiveAdminではそうはいかないので本記事を書くことにしました。

参考: Railsガイドのmemberやcollectionの解説

前提知識

  • ActiveAdminを使ったことがある人
    • ActiveAdminのインストール方法などは記載しません
  • Railsのコントローラやアクションの考え方がわかっている人
    • Railsの基礎的な知識は説明しません

バージョン情報

記事公開時点の最新バージョンを使用しています。

  • Ruby: 3.3.1
  • Ruby on Rails: 7.1.3
  • ActiveAdmin: 3.2.0

呼び出し例

呼び出し例1: 全レコードに対して一括処理したい場合、または特定のレコードとは関係ない処理をしたい場合

主に一覧画面(#index)の右上にボタンを配置する例です。

action_item :call_example_1, only: :index do
  link_to '呼び出し例1', action: :call_example_1
end

collection_action :call_example_1 do
  flash[:notice] = '呼び出し例1が実行されました'
  redirect_to action: :index
end

action_itemによって画面の右上にボタンを配置することができます。表示する画面はonly: :indexと書くことで一覧(#index)画面に絞りました。
公式ドキュメント Action Items

collection_actionによってアクションを追加することができます。
例ではアクション名を#call_example_1としています。
公式ドキュメント Collection Actions

ちなみにlink_toredirect_toはActiveAdminではなくRailsのメソッドです。

一覧画面に"呼び出し例1"というボタンを追加

呼び出し例2: 1レコードに対して処理したい場合

閲覧画面(#show)の右上にボタンを配置する例です。

action_item :call_example_2, only: :show do
  link_to '呼び出し例2', { action: :call_example_2, id: params[:id] }, method: :put
end

member_action :call_example_2, method: :put do
  flash[:notice] = "呼び出し例2が実行されました (ID: #{params[:id]})"
  redirect_to action: :show, id: params[:id]
end

流れは呼び出し例1と似ています。
action_itemではonly: :showとして詳細(#show)画面のみを表示対象としました。
また、処理の中でparams[:id]とすることでIDを取得しています。

member_actionによってアクションを追加することができます。
例ではアクション名を#call_example_2としています。methodはputにしてみましたが、その処理にとって適切なHTTPメソッド (:get:destroyなど) を設定するようにしてください。
公式ドキュメント Member Actions

詳細画面に"呼び出し例2"というボタンを追加

(補足) collection_actionとmember_actionの違い

collection_actionとmember_actionの違いはroutes.rbに記述するcollectionとmemberの違いと同じです。
参考: Railsガイドのmemberやcollectionの解説

collection_action member_action
使用ケース 一覧に対して処理したいケースや
直接関係ないリソースに対して処理したいケース
1件に対して処理したいケース
生成されるパス /admin/company_users/:call_example_1 /admin/company_users/:id/:call_example_2
ルーティングヘルパー call_example_1_admin_company_users call_example_2_admin_company_user

呼び出し例3: 選択されたレコードに対して一括処理したい場合

一覧画面で対象レコードにチェックを入れ、一括で処理する例です。

batch_action '呼び出し例3' do |ids|
  flash[:notice] = "呼び出し例3が実行されました (ID: #{ids.join(', ')})"
  redirect_to action: :index
end

batch_actionにはids (IDの配列) が渡されます。これまでの例とは異なる流れですが、書き方は一番シンプルです。
公式ドキュメント Batch Actions Creating your own

一覧画面に"選択した行を呼び出し例3"というボタンを追加

(TIPS) デフォルトのバッチアクション削除

デフォルトでは全画面に"選択した行を削除する"というボタンが用意されています。

選択した行を削除するボタン

一括削除は便利かもしれませんが、誤って押下してしまう危険性があります。誤操作の危険を感じた場合は削除しておくと安全な画面設計にできるかもしれません。
公式ドキュメント Batch Actions Removal

batch_action :destroy, false

おわりに

アクションの追加例を3パターン紹介してみました。
ActiveAdminはRailsと異なる記法が必要で苦戦することが多いですが、このあたりを抑えておけばたいていの処理は呼び出せるようになるかと思います。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?