2010-08-26 57 views
7

我已經在Rails中獲得了一些我想呈現爲JSON數據的數據。我現在正在做的只是找到模型的所有實例並調用render:json => data。Rails使用Model Root渲染JSON數據

data = Data.find(:all) 
render :json => data 

但是,Rails在每個JSON對象中包含模型名稱。所以,我的JSON數據最終看起來像這樣:

[{modelname:{propertyName: 'value',...}},{modelname:{propertyName: 'value2',...}}] 

,而不是這樣的: [{propertyName的: '值',...},{propertyName的: '值',...}]

modelname總是相同的,我不希望它在那裏。

我改變了在Rails初始化器中的JSON數據中渲染根的選項,但是這會影響我想渲染爲JSON的所有內容,我不想爲此項目執行此操作。

在這種情況下,我希望能夠根據具體情況做到這一點。

我該怎麼做?提前致謝。

回答

2

我沒有找到辦法通過傳遞選項to_json方法來做到這一點(我不相信有這樣的選擇)。你有更多的選擇來做到這一點,從ActiveRecord :: Base繼承的任何類將有include_root_in_json。

做這樣的事情。

Data.include_root_in_json = false 
data = Data.find(:all) 
render :json => data 

希望這會讓你走。

好吧,讓我們試試這個。

DataController < ApplicationControlle 

    private 

    def custom_json(data) 
    Data.include_root_in_json = false 
    data.to_json 
    Data.include_root_in_json = true 
    data 
    end 
end 

然後重新導向應該是這樣

data = Data.find(:all) 
render :json => custom_json(data) 

這是非常愚蠢的代碼,我希望我能想到的,完全是另一回事。讓我問你一下:在json數據中包含模型名稱是什麼?

+0

我剛試過這個,不幸的是,它將全局的include_root_in_json改爲false。如果有幫助,我正在運行Rails 2.3.5。 – CCSab 2010-08-27 00:15:00

1

隨着Rails 3,我發現這樣做更好。覆蓋模型中的as_json,並做如下:

def as_json(options = {}) 
    super(options.merge :methods => [:some_method_that_you_want_to_include_result], :include => {:child_relation => {:include => :grand_child_relation } }) 
end 
12

使用Rails 3,您可以使用active_model_serializers寶石1

,允許您指定一個像這樣的對象的無根渲染:

render :json => data, :root => false 
+0

這對我很好,雖然那段時間應該是逗號? – stickwithjosh 2014-09-06 03:56:25

+1

謝謝,回答編輯有一個逗號 – 2014-09-17 19:45:55