Rails 3.2アプリでは、Jbuilderを使用してjson応答をレンダリングしています(ここでは特別なことは何もありません)。jsonビューは、次のように単純にすることができます。
_model_name.json.jbuilder
json.extract!(page, :id, :name, :url_name)
多くの場合、深くネストされたjsonオブジェクトを返す必要があり、Jbuilderパーシャルはこれに最適です。
_page.json.jbuilder
json.extract!(page, :id, :name, :url_name)
json.page_images (page_images) do |json, page_image|
json.partial! page_image
end
最後の例では、ページ、ネストされたpage_images、json表現を取得します...これも特別なことではありません。
多くの場合、1つのパーシャルが別のパーシャルを呼び出し、2レベルまたは3レベルの深さのネストされたjsonオブジェクトを返す場合があります。
問題
上で述べたように、Jbuilderパーシャルを使用して、複数のパーシャルをすばやくリンクし、ビューの深くネストされたjsonオブジェクトを形成します。また、これらのまったく同じネストされたオブジェクトを(jsonではなく)ハッシュとして構築し、モデルで使用できるようにする必要があります。
.attributesを使用してハッシュを出力するJbuilderオブジェクトを取得するのは簡単です。メソッドですが、Jbuilderにモデルからビューパーシャルへのアクセスを許可することにはいくつかの深刻な問題があります。
Jbuilderソースを見ると、すべてを機能させるには、JbuilderTemplateクラスがコントローラコンテキストにアクセスする必要があるようです。
私たちはこのようなことを試みるかもしれません:
class SomeClass
def initialize pages
@pages = pages
@context = ActionController::Base.new
end
def to_hash
builder = JbuilderTemplate.new(@context)
builder.pages(@pages) do |json, page|
json.partial! page
end
builder.attributes!
end
end
上記の例は明らかに正しくありませんが、何をする必要があるかを示しています。モデルからコントローラーを初期化してから、コントローラーコンテキストを渡す方法がわかりません。
私たちがフォローしているいくつかのリード:
誰かが私たちを正しい方向に向けるのを手伝ってもらえますか?