RailsAdminのアクション機能のカスタマイズ

この記事はウェブクルー Advent Calendar 2023 17日目の記事です。
昨日は@wc_yamasaki さんの「PlayFramework + OneloginでOIDC認証」でした。

# はじめに
普段はScalaでバックエンドの開発を行っていますが、
社内のデータ管理ツールにはRailsAdminを導入しています。
こちらは以下の過去記事でも触れています。
・[RailsAdminを使ってみた](https://qiita.com/da-shi/items/aa76afdea3c528a9b128)
・[RailsAdminと遊ぼう~カスタマイズ戦記~](https://qiita.com/yuko-tsutsui/items/8f016c5cd1986a8f2ea3)

今回、RailsAdminのアクション機能のカスタマイズを最近触ったので、どんな感じか軽く書きました。

# アクションとは
### アクションの例
アクションとは以下のような動作をする箇所です。
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536039/942e2c5a-68ac-ecd3-09fd-e91de90371b4.gif)


- RailsAdminでは、各レコードに対して閲覧、修正、削除のアクションがデフォルトで存在しています。


- 上記画像のタブのほうの「一覧」「編集」などもアクションです（サイトは[過去記事](https://qiita.com/da-shi/items/aa76afdea3c528a9b128#localesjaymlを使った共通項目の日本語化)のようにしています ）。

- タブのほうで新規レコードの作成ができるアクションがデフォルトであるので、デフォルトのアクションだけでcrud操作ができます(インポートはデフォルトではないです。[過去記事](https://qiita.com/yuko-tsutsui/items/8f016c5cd1986a8f2ea3#データをcsvからインポートしたい))。

- 各レコードでのアクションは、レコード別で処理するときに使われ、
タブのアクションでは、そうでないときに使われるもののようです。

## アクションのカスタマイズ
crud操作はデフォルトのアクションがあるので不要ですが、
デフォルトで物足りないときに独自のアクション(カスタムアクション)を追加できます。

# カスタムアクションの追加
カスタムアクションの追加について書きます。


## カスタムアクションクラスの作成
lib配下に以下のようなファイルを追加します。

```lib/example_action.rb
module RailsAdmin
  module Config
    module Actions
      class ExampleAction < RailsAdmin::Config::Actions::Base
        RailsAdmin::Config::Actions.register(self)

        # 各レコードに対してのアクションはmember
        # タブに表示するならcollectionにする
        register_instance_option :member do
          true
        end
        # 表示の設定
        # 今回はExampleモデルだけ出すように設定
        register_instance_option :visible? do
          bindings[:abstract_model].model == Example
        end
        # ルーティング
        # getだけならデフォルトなので書かなくてもいい
        register_instance_option :http_methods do
          [:get]
        end
        # アイコン設定。今回は⭐
        register_instance_option :link_icon do
          'icon-star'
        end

        # controller
        # ここにアクションの内容など書く
        register_instance_option :controller do
          Proc.new do
            if request.get?
            # app/views/rails_admin/main/example_action.html.erbへ飛ぶ
            else
              raise "エラーメッセージ"
            end
          end
        end

      end
    end
  end
end
```

## アクションの登録
config/initializers/rails_admin.rb に以下のように記述して、カスタムアクションを登録します。

```config/initializers/rails_admin.rb
# アクションクラスをrequire
require Rails.root.join('lib', 'example_action.rb')

RailsAdmin.config do |config|
  config.actions do
    dashboard
    index
    # ...その他actions
    example_action     # 今回追加
  end

end
```
アクションを追加するここの並びで画面でのアクションの表示順も変わります。
最後尾に追加したのでmemberのアクション中でも最後に表示されます。

##  viewの用意
app/views/rails_admin/main/example_action.html.erb へ飛ぶのでviewを用意する

```app/views/rails_admin/main/example_action.html.erb
<h4>
  exampleのアクション
</h4>
<div>
  <%= link_to "戻る", :back %>
</div>
```

## とりあえず確認
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536039/3a807fc4-d867-3007-354a-0f5912a39da6.gif)
アクションの追加はできていますね。
サイトは日本語化しているので、Translation missingと出てます。

## ロケール
日本語化が必要そうなので、
[過去記事](https://qiita.com/da-shi/items/aa76afdea3c528a9b128#localesjaymlを使った共通項目の日本語化)のようにconfig/locales/ja.ymlに追加します

```config/locales/ja.yml
ja:
  admin:
    js:
      example_action:
        menu: "例1メニュー"
        title: "例1タイトル"
        breadcrumb: "例1パンくずリスト"
```

## 再度確認
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536039/83e7c489-2dc9-76a8-b635-d601c978409e.gif)

# まとめ
カスタムアクションの良い例が思い浮かばず、特に機能のないアクションです。
デフォルトのcrudだけで割と事足りていると思いました。
とりあえず、RailsAdminのアクションはこんな感じと思ってもらえたら幸いです。

画面でpostする機能つけたりすると認証エラーなどなったりしましたが、素直にhtml.erbに認証情報を入れると動くと思います。

# 参考資料
[Actions](https://github.com/railsadminteam/rails_admin/wiki/Actions)
[Custom action](https://github.com/railsadminteam/rails_admin/wiki/Custom-action)
[Rails Admin：Custom Actionの追加](https://hana-ori.hatenablog.com/entry/2016/01/15/193828)

# おわりに
明日は @wc-kadowakiさんの投稿になります。

ウェブクルーでは一緒に働いていただける方を随時募集しています。
お気軽にご応募ください。
https://www.webcrew.co.jp/recruit/