LoginSignup
3
1

More than 5 years have passed since last update.

administrateとacts-as-taggable-onの連携

Last updated at Posted at 2017-05-28

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)

app/dashboards/xxx_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でネームスペースを切るようにした。

app/dashboards/acts_as_taggable_on/tag_dashboard.rb
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
app/dashboards/acts_as_taggable_on/tagging_dashboard.rb
module ActsAsTaggableOn
  class TaggingDashboard < Administrate::BaseDashboard
    #...
  end
end
app/controllers/admin/acts_as_taggable_on/tags_controller.rb
module Admin
  module ActsAsTaggableOn
    class TagsController < Admin::ApplicationController
      # ...
    end
  end
end
app/controllers/admin/acts_as_taggable_on/taggings_controller.rb
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を返すので、リンクやボタンが表示されないです。

administrate-0.7.0/app/controllers/administrate/application_controller.rb
    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

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1