在JSON Rails中包含根节点

时间:2013-05-25 23:11:01

标签: ruby-on-rails json

我需要在我的JSON响应中包含顶级节点,以便已部署的移动应用程序正常运行。我的模型是语言和帖子,帖子属于语言。应用程序需要的响应是:

{
  "english": {
  "posts": [
  {
    "title": "title",
    "content": "content"
  },

我的语言控制器代码如下所示:

@posts = @language.posts
render :json => { :posts => @posts.as_json

只需要将JSON中的语言提升到一级以上即可。在环境或deploy.rb中没有配置来处理这个吗?

由于

3 个答案:

答案 0 :(得分:2)

为什么不使用JSON模板?然后你可以根据需要自定义它。

例如,在您的控制器中:

# app/controllers/posts_controller.rb
def show
  @language = ...
  @posts = ...
  respond_to do |format|
    format.json
  end
end

然后在你的观点中,

/* app/views/posts/show.json.erb */
{
  "<%= @language =>": {
    "posts": <%= @posts.to_json.html_safe =>
  }
}

我不确定以这种方式嵌套JSON是否会导致语法问题。或者,您也可以构建哈希,然后调用to_json。例如,

def show
  @language = ...
  @posts = ...
  render json: { @language => @posts }
end

答案 1 :(得分:1)

我相信,

@language.as_json(:include => :posts)会产生你想要的东西。

编辑:

class Language < ActiveRecord::Base
  ...
  def to_json(opts = {})
    {self.name => self.posts}.to_json(opts)
  end
  ...
end

答案 2 :(得分:1)

如果您想在所有JSON响应中包含root,那么您可以直接前往config/initializers/wrap_parameters.rb

你会看到/或者如果没有,你可以添加

# To enable root element in JSON for ActiveRecord objects.
ActiveSupport.on_load(:active_record) do
 self.include_root_in_json = true
end

如果这还不够,并且您想进一步自定义JSON数据,只需与active_model_serializers联系即可。您将在一分钟内获得自定义JSON响应,并且您不仅限于在视图/渲染中使用它们。