🖥

Rails – APIモードでRailsAdminを利用する

2023/09/15に公開

gem のインストール

Gemfileに以下を追加して bundle install

gem 'rails_admin', '~> 3.1.2'
gem 'rails_admin-i18n'

rails admin のインストール

rails g rails_admin:install

rails admin 3.1.2 では Gemfile に sassc-rails が追加されるのでもう一度 bundle install

configを追加する

api/config/application.rb

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

参考: https://zenn.dev/atsushi101011/articles/5b76bf63cce9ac

manifest.js の追加

rails server でサーバー起動しようとすると以下エラーが発生するので

Expected to find a manifest file in `app/assets/config/manifest.js` (Sprockets::Railtie::ManifestNeededError)
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

メッセージどおりにapp/assets/config/manifest.js を追加する

  //= link_tree ../images
  //= link_directory ../javascripts .js
  //= link_directory ../stylesheets .css

assets のディレクトリ追加

image

mkdir app/assets/images
mkdir app/assets/javascripts
mkdir app/assets/stylesheets

画面アクセス

api/config/routes.rb に追加されたパスにアクセスする

例: http://localhost:3000/admin/

READONLYにする

設定で新規作成/削除/編集を無効化すればOK

api/config/initializers/rails_admin.rb

RailsAdmin.config do |config|
  ...
  
  config.actions do
    dashboard                     # mandatory
    index                         # mandatory
    # new
    export
    # bulk_delete
    show
    # edit
    # delete
    show_in_app
  end
end

表示対象のテーブル(モデル)を限定する

api/config/initializers/rails_admin.rb

RailsAdmin.config do |config|
  ...
  config.included_models = %w[Book]
end

認証の追加 - Deviseを利用する場合

必要に応じてDevise用のモデル・コントローラー・ビューなどを作成する

rails g devise admin
rails g devise:views admins
rails g devise:controllers admins

RailsAdminの設定

api/config/initializers/rails_admin.rb

RailsAdmin.config do |config|
  config.asset_source = :sprockets

  ### Popular gems integration

  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :admin
  end
  config.current_user_method(&:current_admin)
...

https://blog.nightonly.com/2020/05/16/railsアプリにサクッとrailsadminを導入/

ApplicationController の問題

DeviseはデフォルトでRailsのApplicacationControllerを継承する
なので ApplicacationController で ActionController::API を継承してしまっているとちょっとややこしい

この継承元を ActionController::Base に変えてしまえば Web版のDeviseは利用できるようになるが、APIの動作に影響しそう

例:

class ApplicationController < ActionController::API
end

対応としてはdeviseの設定で親となる ApplicationController を変更できるのでそうした

Devise.setup do |config|
  config.parent_controller = 'DeviseApplicationController'
end

こうするとDevise向けには ActionController::Base を継承したクラスを使うことが出来る

例:

class DeviseApplicationController < ActionController::Base
  protect_from_forgery
end

ただ実装のAPIでもDeviseを利用している場合はこの DeviseApplicationController が使われてしまう
Controllerの単位で継承元となる ApplicationController を切り替える設定はなさそう

API向けの処理ではDevise向けのコントローラーでメソッドをオーバーライドして利用すると良いだろう
FLASHメッセージを無効化するとか

class UserSessionsController < Devise::SessionsController
  # POST /resource/sign_in
  def create
    self.resource = warden.authenticate!(auth_options)
    # set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end
end

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2023-09-12

Discussion