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

  • 0
    いいね
  • 0
    コメント

    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