Rails – APIモードでRailsAdminを利用する
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 のディレクトリ追加
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)
...
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オープンチャットもご利用ください。
公開日時
2023-09-12
Discussion