There's an echo in my head

日々のメモ。

ActiveDecoratorと組み合わせてJbuilderのpartial!を使うとnil?というキーができる

ActiveDecoratorと組み合わせてJbuilderpartial!を使ったら、次のようにnil?というキーで空のハッシュができていた。

{
  "nil?": {},
  // .jbuilderに書いた通りのキー
}

これは、partial!したときに裏で呼ばれるrenderメソッドの:localsオプションにjsonオブジェクト(JbuilterTemplateのインスタンスで、BasicObjectを継承したもの)が渡されており、これに対してActiveDecorator::Decorator#decorateによってメソッドを生やそうとした際にnil?が呼ばれていたのが原因だった。

回避策としては、JbuilderTemplateオブジェクトに対してdecorateする必要はほとんどないので、その場合はメソッドを生やそうとせずにすぐにdecorateを抜けてしまえばいい。

module ActiveDecoratorWrapperForJbuilderTemplate
  def decorate(obj)
    return obj if JbuilderTemplate === obj
    super
  end
end

module ::ActiveDecorator
  class Decorator
    prepend ::ActiveDecoratorWrapperForJbuilderTemplate
  end
end

同じようなことをやってくれるgemも書いたので、これを使ってしまうのもいい。

http://rubygems.org/gems/jbuilder-active_decorator

Gemfileには次のように書く。

gem 'jbuilder-active_decorator', require: 'jbuilder/active_decorator'
このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。