😺

Rails APIモードでGem "rails-admin"を導入する手順

2022/02/24に公開

Rails APIモードで Gem "rails_admin"を使用して管理画面を作る際に、少し詰まったので解決までの手順を示す。

普通のRailsアプリケーションでのrails_adminの導入は以下の記事で書きました。
https://zenn.dev/atsushi101011/articles/98daf84f74facd

Rails APIモードと普通のRailsアプリケーションの違いでエラーが起きている

はじめは、普通のRailsアプリの手順で導入しようとしていました。すると以下のエラーが出ました。

$ rails g rails_admin:instal
(省略)
Expected to find a manifest file in `app/assets/config/manifest.js`
But did not, please create this file and use it to link any assets that need
to be rendered by your app:

Example:
  //= link_tree ../images
  //= link_directory ../javascripts .js
  //= link_directory ../stylesheets .css
and restart your server

assets/config/manifest.jsが見つからない、と言われました。Rails APIモードでは生成されないファイルです。なので、assets/config/manifest.jsファイルを新規作成します。

もう一度コマンドを打つと

$ rails g rails_admin:instal
(省略)
Required middlewares for RailsAdmin are not added
To fix this, add

  config.middleware.use ActionDispatch::Cookies
  config.middleware.use ActionDispatch::Flash
  config.middleware.use Rack::MethodOverride
  config.middleware.use ActionDispatch::Session::CookieStore, {:key=>"_backend_session"}

to config/application.rb.

今度は違うエラー。ミドルウェアがないからエラーが出ています。APIモードでは、一部のミドルウェアが入っていないようです。ですので、自分でミドルウェアを設定する必要があります。エラーで表示されているコードをコピーして、config/application.rbに追記します。

config/application.rb
config.api_only = true

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Flash
config.middleware.use Rack::MethodOverride
config.middleware.use ActionDispatch::Session::CookieStore, {:key=>"_backend_session"}

(Railsのミドルウェアに関して詳しい解説は以下。)
https://railsguides.jp/rails_on_rack.html

あとは、管理画面を表示するために、コントローラーの継承を変えていきます。
app/controllers/application_controller.rbをAPIではなくBaseを継承するように書き換えます。これでApplicationControllerが設定したミドルウェアを使えるようになります。
また、APIモードでデータ取得もしなければいけないので、api_controller.rbも新規作成しておきましょう。コントローラーの継承が複雑になるので注意してください。

以下の手順で、Rails APIモードで Gem "rails_admin"を使用して管理画面を作ることができると思います。

質問があればコメントをお願いいたします。

参考資料

https://udayan28.me/2019/10/06/how-to-build-rails-api-mode-with-activeadmin.html

Discussion