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

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)

```ruby: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でネームスペースを切るようにした。

```ruby: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
```

```ruby:app/dashboards/acts_as_taggable_on/tagging_dashboard.rb
module ActsAsTaggableOn
  class TaggingDashboard < Administrate::BaseDashboard
    #...
  end
end
```

```ruby:app/controllers/admin/acts_as_taggable_on/tags_controller.rb
module Admin
  module ActsAsTaggableOn
    class TagsController < Admin::ApplicationController
      # ...
    end
  end
end
```

```ruby: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を返すので、リンクやボタンが表示されないです。

```ruby: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