2010-08-26 58 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