ActiveDecoratorと組み合わせてJbuilderのpartial!を使ったら、次のように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'