Posted at

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

More than 5 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


注意事項

ぱっと思いついただけで、簡単な動作検証しかしていません。

これで本当に、いろんなものが問題ないかはわからない。

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