Rails使用模型根呈现JSON数据

CCS*_*Sab 8 json ruby-on-rails

我在Rails中有一些数据要呈现为JSON数据.我现在正在做的只是查找模型的所有实例并调用render:json => data.

data = Data.find(:all)
render :json => data
Run Code Online (Sandbox Code Playgroud)

但是,Rails在每个JSON对象中包含模型名称.所以我的JSON数据最终看起来像这样:

[{modelname:{propertyName: 'value',...}},{modelname:{propertyName: 'value2',...}}]
Run Code Online (Sandbox Code Playgroud)

而不是:[{propertyName:'value',...},{propertyName:'value2',...}]

型号名称始终相同,我不希望它在那里.

我更改了选项以在其中一个Rails初始值设定项中呈现JSON数据中的根,但这会影响我想要呈现为JSON的所有内容,我不想为此项目执行此操作.

在这种情况下,我希望能够根据具体情况做到这一点.

我怎样才能做到这一点?提前致谢.

Vla*_*nov 13

使用Rails 3,您可以使用active_model_serializers gem 1

这允许您指定对象的无根呈现,如下所示:

render :json => data, :root => false
Run Code Online (Sandbox Code Playgroud)


Hug*_*ugo 2

我没有找到通过将选项传递给 to_json 方法来做到这一点的方法(而且我不相信有这样的选项)。您有更多选择来执行此操作,任何继承自 ActiveRecord::Base 的类都将具有 include_root_in_json。

做这样的事情。

Data.include_root_in_json = false
data = Data.find(:all)
render :json => data
Run Code Online (Sandbox Code Playgroud)

希望这能让你继续前进。

好吧,让我们试试这个。

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
Run Code Online (Sandbox Code Playgroud)

那么你的重定向将如下所示

data = Data.find(:all)
render :json => custom_json(data)
Run Code Online (Sandbox Code Playgroud)

这是非常愚蠢的代码,我希望我能完全想到别的东西。让我问你:将模型名称包含在 json 数据中是什么意思?