2012-02-10 10 views
2

私たちのレール3.2アプリでは、Jbuilderを使ってjsonレスポンスを表示しています(ここでは特別なことは何もありません)。 JSON形式のビューは、このような単純なことができますRailsレンダリングjson partial in model

json.extract!(page, :id, :name, :url_name) 

_model_name.json.jbuilder私たちはしばしば深くネストされたJSONオブジェクトを返す必要があり、JBuilderのパーシャルは、このために素晴らしい仕事:

_page

json.extract!(page, :id, :name, :url_name) 
json.page_images (page_images) do |json, page_image| 
    json.partial! page_image 
end 

.json.jbuilder最後の例では、ページ、およびネストされたpage_images、JSON表現...再び何も特別なを取得します。

多くの場合、1つの部分で別の部分が呼び出され、2〜3レベルの入れ子になったjsonオブジェクトが返されることがあります。

PROBLEM

私たちはすぐにビューのために深くネストされたJSONオブジェクトを形成するために一緒に複数のパーシャルをリンクするJBuilderのパーシャルを使用し、前述のように。また、これらの全く同じネストされたオブジェクトを(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 

上記の例では明らかに間違っているが、それは何をすべきかを示しています。

は、我々はこのような何かを試してみてください。私はどのようにモデルからコントローラを初期化し、コントローラコンテキストを渡すかについてはわかりません。私たちは以下の通りです

いくつかのリード:

誰もが正しい方向に私たちを指すよう助けることができますか?

答えて

1

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

+0

あなたはまだになりたい場合は(http://stackoverflow.com/questions/9234018/rails-rendering-json-partial-in-model#answer-37977283)[以下の答え]私を見てくださいjbuilderテンプレートを再利用することができます。 –

0

私はこの全く同じことをするためにActiveModel :: Serializerを使用します。モデル内のjsonをレンダリングするか、またはこれを行うことができます。これにより、キャッシュが事前に設定されます。

これを行うための構文は、最初は明らかではなかった

ので、私はここに掲示しています:

ItemSerializer.new(item).to_json 
0

をあなたは本当にこの機能が必要な場合、私はあなたにいくつかのシムを表示することができます。

c = ActionController::Base.new 
c.instance_variable_set '@item', Item.find(5) 
JSON.parse c.render_to_string('items/show') 
2

私はあなたが正しいところにいると確信しています。 json.array!を呼び出して、イニシャライザでブロックを直接渡すと、パーシャルを正常に構築できるはずです。

def to_hash 
    builder = JbuilderTemplate.new(@context) do |json| 
    json.array! @pages, partial: 'path/to/partial' 
    end 
    builder.attributes! 
end