※この記事に登場するソースコードは僕個人が開発しているプロジェクトのもので仕事は無関係です
admin画面を作っていきます。
いままでRailsでadmin画面を作る場合、activeadminかrails_adminのどちらかを使うことが多かったんですが、thoughtbot製のものがあることを知ったのでこれを試してみようと思います。
現時点ではデモも何もみてない状態でなんですが、thoughtbotへの信頼が高まりすぎていて自分のなかではもう完全にadmin画面はこれ一択になってます。
恋は盲目
まずはREADMEを読みます。
Administrate is still pre-1.0, and there may be occasional breaking changes to the API. Check the release notes for important updates.
ウッ、 いきなりひるみました。
Administrate solves the same problem as Rails Admin and ActiveAdmin, but aims to provide a better user experience for site admins, and to be easier for developers to customize.
To accomplish these goals, Administrate follows a few guiding principles:
No DSLs (domain-specific languages) Support the simplest use cases, and let the user override defaults with standard tools such as plain Rails controllers and views. Break up the library into core components and plugins, so each component stays small and easy to maintain.
なるほど。確かにrails_adminだったかactiveadminだったか思い出せませんがDSL少しつらかった記憶あります。
続いてGetting started にしたがってセットアップしていきます。
$ bundle add administrate
$ bundle exec rails g administrate:install
そして localhost:3000/admin にアクセスすると出ました。admin画面。
※内臓(モデル全部)が丸出しになってるのでスクショ貼れないです、、
先のコマンドによって config/routes.rb にこんな感じでrouteが追加されていました。
namespace :admin do resources :users resources :foo resources :bar root to: "users#index" end
もちろんこれらはユーザーにアクセスされて良い画面ではないので特定のユーザー(admin)だけがアクセスできるようにroutes.rbをいじります。
このアプリケーションでは User#admin? でadminか否かを判断できるように作ってあるので以下のように書き換えます
authenticate :user, lambda { |u| u.admin? } do namespace :admin do resources :users resources :foo resources :bar root to: "users#index" end end
これでauthenticationは大丈夫になりました。
ひととおり触ってみたら、ActiveStorageを使っているモデルで以下のようなエラーが出ることがわかりました。
NameError in Admin::Images#new Showing /var/lib/gems/2.5.0/gems/administrate-0.12.0/app/views/fields/has_one/_form.html.erb where line #19 raised: uninitialized constant FileAttachmentDashboard
いろいろググってみたらこういうGemがあるみたいですね。
個人的にGemは本当に必要でなければ入れたくないマン(ほかのGemのupdateをブロックしたり、邪魔になることがあるので使うGemは少なければ少ないほど良いと考えています)なので、ここでさらに予定外のGemを追加するのは少し抵抗があります。
解決になっていませんが、このGemの導入は見送ってとりあえず以下のようにアタッチメントは修正できないようにしておきます。
admin画面からファイルを添付するようなケースはいまのところ考えられないのでこれはこれで良いかもしれません。
もし必要になったらそのときにまた検討します
FORM_ATTRIBUTES = %i[ folder - file_attachment - file_blob name thumbnail_url ].freeze
より詳細なドキュメントはここにおいてるみたいです
https://administrate-prototype.herokuapp.com/
僕のアプリケーションの場合はImageモデルのサムネイルを表示できると便利なので少しviewも修正します。
現状のままだとurlが文字列で表示されているのでここを画像が表示されるようにしたい感じです。
ここに書いてあるFieldという概念を使えばまさにやりたいことができそうです
https://administrate-prototype.herokuapp.com/adding_custom_field_types
$ bundle exec rails generate administrate:field thumbnail Running via Spring preloader in process 3530 create app/fields/thumbnail_field.rb create app/views/fields/thumbnail_field/_show.html.erb create app/views/fields/thumbnail_field/_index.html.erb create app/views/fields/thumbnail_field/_form.html.erb
app/fields/thumbnail_field.rbは、to_sというメソッド名は少し気になるものの、とりあえずそのままでよさそうです。
require "administrate/field/base" class ThumbnailField < Administrate::Field::Base def to_s data end end
app/views/fields/thumbnail_field/_show.html.erbはimage_tagを使うように変更します
- <%= field.to_s %> + <%= image_tag field.to_s %>
最後にImageDashboardクラスを修正
ATTRIBUTE_TYPES = { folder: Field::BelongsTo, id: Field::Number, name: Field::String, created_at: Field::DateTime, updated_at: Field::DateTime, - thumbnail_url: Field::Text, + thumbnail_url: ThumbnailField, }.freeze
でました。
app/views/fields/thumbnail_field/_index.html.erbも同じように修正して完了です。