2

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

上記の例は明らかに正しくありませんが、何をする必要があるかを示しています。モデルからコントローラーを初期化してから、コントローラーコンテキストを渡す方法がわかりません。

私たちがフォローしているいくつかのリード:

誰かが私たちを正しい方向に向けるのを手伝ってもらえますか?

4

4 に答える 4

2

あなたはここで正しい方向に進んでいたと確信しています。json.array!イニシャライザでブロックを直接渡すと、通常どおりパーシャルを呼び出してビルドできるはずです。

def to_hash
  builder = JbuilderTemplate.new(@context) do |json|
    json.array! @pages, partial: 'path/to/partial'
  end
  builder.attributes!
end
于 2016-06-22T20:05:24.767 に答える
1

解決策が見つかりませんでした。as_jsonを使用してモデルjson出力を構成することに戻りました。

于 2012-02-11T12:03:55.363 に答える
0

ActiveModel :: Serializerを使用して、これとまったく同じことを行います。モデル内またはどこでもjsonをレンダリングできます。これは、キャッシュに事前入力するために行います。

これを行うための構文は最初は明白ではなかったので、ここに投稿します:

ItemSerializer.new(item).to_json
于 2013-06-21T17:27:07.707 に答える
0

この機能が本当に必要な場合は、いくつかのシムを紹介できます。

c = ActionController::Base.new
c.instance_variable_set '@item', Item.find(5)
JSON.parse c.render_to_string('items/show')
于 2014-01-15T16:48:38.547 に答える