administrateでacts-as-taggable-onと連携できるようにする
最近、管理画面をadministrateで作ってみたが、 acts-as-taggable-onが設定されたモデルをうまく表示する方法が分からなかった。。
試行錯誤の結果、一応できるようになったのでメモとして残す。
やったこと
- app/dashboards/xxx_dashboard.rbにtagsをField::HasManyで定義
- acts_as_taggable_onのtagとtaggingのdashboardを生成
- 生成したdashboard/controllerを移動・修正
- config/routes.rbの設定
app/dashboards/xxx_dashboard.rbにtagsをField::HasManyで定義
acts_as_taggableを定義しているモデルのxxx_dashboard.rbにtagsを定義する。
(例えば、bookモデルにacts_as_taggableを定義している場合はbook_dashboard.rb)
ATTRIBUTE_TYPES = { # ... tags: Field::HasMany.with_options(class_name: "::ActsAsTaggableOn::Tag"), } COLLECTION_ATTRIBUTES = { # ... :tags, } SHOW_PAGE_ATTRIBUTES = { # ... :tags, } FORM_ATTRIBUTES = { # ... :tags, }
administrateのField::HasManyができると編集画面などで便利なので、Field::HasManyでできるようにするのが目標だった。
acts_as_taggable_onのtagとtaggingのdashboardを生成
administrateのgenarateコマンドを実行する。
$ bundle exec rails generate administrate:dashboard ActsAsTaggableOn::Tag $ bundle exec rails generate administrate:dashboard ActsAsTaggableOn::Tagging
生成したdashboardを移動・修正
$ mkdir app/dashboards/acts_as_taggable_on $ mkdir app/controllers/admin/acts_as_taggable_on $ mv app/dashboards/tag_dashboard.rb app/dashboards/acts_as_taggable_on/ $ mv app/controllers/admin/tags_controller.rb app/controllers/admin/acts_as_taggable_on/ $ mv app/dashboards/tagging_dashboard.rb app/dashboards/acts_as_taggable_on/ $ mv app/controllers/admin/taggings_controller.rb app/controllers/admin/acts_as_taggable_on/
生成したままのclass ActsAsTaggableOn::TagDashboard
などのままでもいいが、私は下記のようにmoduleでネームスペースを切るようにした。
module ActsAsTaggableOn class TagDashboard < Administrate::BaseDashboard #... # Overwrite this method to customize how tags are displayed # across all pages of the admin dashboard. # def display_resource(tag) ←コメントアウトされているのを解除。ここが新規/編集時のtagsに表示される項目名になる tag.name end end end
module ActsAsTaggableOn class TaggingDashboard < Administrate::BaseDashboard #... end end
module Admin module ActsAsTaggableOn class TagsController < Admin::ApplicationController # ... end end end
module Admin module ActsAsTaggableOn class TaggingsController < Admin::ApplicationController # ... end end end
config/routes.rbの設定
各画面でacts-as-taggable-on関連のパスも生成しようとするのでroutes.rbの設定をしておく。
namespace :admin do #... namespace :acts_as_taggable_on do resources :tags resources :taggings end end
これで、acts-as-taggable-onを利用しているモデルのdashboardでもCRUDがhas_manyと同様でできるようになる。
ただ、tagやtaggingは表示のみで新規/編集/削除が画面からできないのでできるようにしたいところ(まだ、直近で必要無いので今は保留)
ネームスペースで区切られたモデルはまだサポートされてなさそう。 下記のpull requestが取り込まれると解決するか?
2017/06/27 追記
最新のmasterブランチだと上記のpull requestも取り込まれていて、HasOneもサポートされています!
一応、Qiitaの方にも投稿しておいた。 qiita.com