decoratorをviewで使っているのにno method errorになる・・・


モデルにメソッドを用意したものの、どう考えてもView専用だったのでdecoratorに移動しよう
ってことでdecoratorに移動させたらNoMethodErrorになった

ここでは仮にfuga_decoratorのdeco_nameメソッドとして

_show.html.slim
= hoge.fuga.deco_name
undefined method `deco_name' for #<Fuga:0x007f8ef2ae23a0>

解決策としては

_show.html.slim
- foo = ActiveDecorator::Decorator.instance.decorate(hoge.fuga)
= foo.deco_name

こんな感じでクリア

あとで試してみたらこれでもいいらしい

_show.html.slim
- ActiveDecorator::Decorator.instance.decorate(hoge.fuga)
= hoge.fuga.deco_name

これでなんでOKなのかよくわからないけど、うまいことやってくれてるんだろうなw
(ソース読めよ!!)

で、エラーになった原因だけど、decoratorはどうやらcontrollerからviewに渡す際にdecorateしてるみたいで、
controller内で宣言した変数とかには使えるけど、has_oneとかbelongs_toとかみたいな関連要素に関しては、
controller内で宣言されてないので明示的にdecorateしてあげる必要があるみたい。

今回の場合だったら

hoges_controller.rb
def show
  ・・・
  @fuga = hoge.fuga
end
_show.html.slim
= @fuga.deco_name

みたいにすればviewでdecorateしなくても使えるみたい。

あとはpartialに渡す時もdecorateしてくれるそうなので、うまくrenderを利用すればdecorateを書く必要はないっぽい。

また少し賢くなった

参考

メソッドをhelperからdecoratorに移動すると undefined method `term' のエラーが発生する