LoginSignup
17
5

More than 5 years have passed since last update.

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

Posted at

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

17
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
5