ActiveDecoratorはリレーションのオブジェクトには効かない

ActiveDecoratorで作ったメソッドにアクセスできなかったのでメモ。
@hoge.piyo.decorate_methodみたいな感じで、Hogeモデルに対してbelongs_toなモデル(Piyo)のメソッド(PiyoDecoratorで定義したdecorate_method)にアクセスしようとしたらmethod_missingになってしまった。

ググったら以下のサイトとスライドがとても分かりやすかった。

ActiveDecoratorが有効になるのは、renderされるタイミングrender partialされるタイミングで、そのときに渡されている変数に対してのみらしい。
なので、@hoge.piyoをrender partialのlocalesで変数として違うテンプレートに渡すなどをすればいいらしい。
だが、そこまでするほどでもないなー、仰々しい…という場合は、@を付けてしまえばいいなと思った。つまり、こう。

class HogeController < ApplicationController
  def show
    @hoge = Hoge.find params[:id]
    @piyo = @hoge.piyo
  end
end

こうしてしまえば、@piyoはActiveDecoratorが有効になった状態になるので、普通にviewで@piyo.decorate_methodが使えるようになる。


タグ Ruby, Ruby on Rails | パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です