2012-02-10 153 views
2

在我們的rails 3.2應用程序中,我們使用Jbuilder來呈現我們的json響應(這裏沒有特別之處)。 JSON的觀點可能是如此簡單:Rails在模型中呈現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的表示...再次沒有什麼特別的。

通常,單個部分會調用另一個部分,並且可能會返回深度爲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 

上面的例子顯然是不正確的,但它說明了需要做什麼。我只是不確定如何通過從模型初始化控制器,然後傳遞控制器上下文。

一些線索,我們下面:

誰能幫助我們指出了正確的方向?

回答

1

找不到解決方案。我們回到使用as_json來配置我們的模型json輸出。

+0

看一看我的[以下答案】(http://stackoverflow.com/questions/9234018/rails-rendering-json-partial-in-model#answer-37977283)如果你仍然想成爲能夠重用您的jbuilder模板。 – 2016-06-30 17:07:23

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