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'