ActiveDecorator で関連先のモデルをデコる

Rails で view のロジックを切り出すために ActiveDecorator を使ってる.

The Ruby Toolbox で Rails Presenters のランキング見たら ActiveDecorator は全然人気なくて,Draper 最高!な雰囲気を感じる.うむ.

ちなみに ActiveDecorator の説明を見たら for Rails 3 って書いてあって ( ゚д゚) って顔したけど,GitHub の説明見たら for Rails 3 and Rails 4 ってなってて安心した.要メンテ!

なんて言ってみたものの,今使ってるの Rails 3.2.21 なんで関係ないんですけどもw

ActiveDecorator - The Ruby Toolbox

A simple and Rubyish view helper for Rails 3

GitHub - amatsuda/active_decorator: ORM agnostic truly Object-Oriented view helper for Rails 3, 4 and 5

A simple and Rubyish view helper for Rails 3 and Rails 4. Keep your helpers and views Object-Oriented!

関連先のモデルをデコるときは partial で

本題に入ろう.自戒の念も込めて.

ActiveDecorator の思想として,関連モデルはデコれないっていうのは頭に入ってるんだけど,毎回忘れちゃってて,いざ動かしたら undefined method になって「ぬっほー!」って叫ぶ.そんなお決まりパターンを繰り返してる.

例は悪いけど,例えばこんな感じで「ユーザーが所属してる企業のロゴをデコる」場合,undefined method 'logo' ってなる.@user の関連先である @user.company をデコろうとしてるから.初めて使う場合ここでハマる.

# undefined method 'logo'
@user.company.logo

解決方法としては partial でコンテキストを絞る.

index.html.haml

= render partial: 'logo', locals: { company: @user.company }

_logo.html.haml

company.logo

デコれる!無事解決!

まとめ

Draper 初体験しないと!

よく見る資料

関連エントリー