administrateでacts-as-taggable-onとの連携方法。
administrateのField::HasManyができると編集画面などで便利なので、acts-as-taggable-onの連携部分をField::HasManyでできるようにするのが目的だった。
(ちょっと思い出しながらなので、何か不備あったらすいません。)
やったこと
- 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をField::HasManyで定義する。
(例えば、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,
}
ポイントはField::HasMany.with_optionsのclass_nameオプションで::ActsAsTaggableOn::Tagを指定すること。
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/controllerを移動・修正
$ 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
以上、これでadministrateでacts-as-taggable-onとの連携ができるはず。
【2017/05/30 追記】
ただ、これだとacts_as_taggable_on/tagsやacts_as_taggable_on/taggingsのDashboardから直接編集できなかったです。。
そもそも編集や削除のリンクが出ないです。。。
ソースコードを追ってみるとvalid_action?のチェックの部分が、ネームスペースで区切られたモデルだと上手く判定できずにfalseを返すので、リンクやボタンが表示されないです。
helper_method :valid_action?
def valid_action?(name, resource = resource_name)
!!routes.detect do |controller, action|
controller == resource.to_s.pluralize && action == name.to_s
end
end
下記のpull requestがマージされると解決しそうに見える。
https://github.com/thoughtbot/administrate/pull/871