Rails
Draper

ぼくのかんがえた最強のDraperの使い方

More than 3 years have passed since last update.

Draperは便利、けどめんどくさい

Draperが便利なのは言うに及ばず。
けど、いちいち↓みたいにdecorateって書いたりするのが激しくめんどくさいです。

Article.first.decorate
ProductDecorator.new(Widget.first)
ProductDecorator.decorate(Widget.first)
ArticleDecorator.decorate_collection(Article.all)
Article.popular.decorate

decorates_assignedなんてのもあったりしますが、
CanCanのload_and_authorize_resourceじゃ使えないし。

そこで、

思いついた最強のDecorating方法がこれ。

application_controller.rb
class ApplicationController < ActionController::Base
  ...
  def view_assigns
    Hash[
      super.map do |key, value|
        value = value.decorate if value.respond_to?(:decorate) && value.decorator_class?
        [key, value]
      end
    ]
  end

ActionController::Base#view_assignsというのはControllerがViewに渡す値をHashで返してるところ。
これをOverrideしてdecorateできるものを全部decotateしてしまうというのはどうだろう。

ControllerではDraperのことなんか気にしなくていい。

使用例

それぞれのControllerでいつもどおりやるだけで、ViewではDecoratorを扱える

article_controller.rb
class ArticleController < ApplicationController
  def index
    @articles = Article.all
  end
end

注意事項

ぱっと思いついただけで、簡単な動作検証しかしていません。
これで本当に、いろんなものが問題ないかはわからない。

コメントもらえると助かります。