モデルにメソッドを用意したものの、どう考えても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' のエラーが発生する