1

我需要在我的 JSON 响应中包含顶级节点,以便已经部署的移动应用程序能够正常工作。我的模型是语言和帖子,其中帖子属于_to 语言。应用程序需要的响应是这样的:

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

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

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

只需将 JSON 中的语言放在其上一级即可。环境或 deploy.rb 中没有配置来解决这个问题吗?

谢谢

4

3 回答 3

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
于 2013-05-26T00:04:41.917 回答
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 响应,并且您不仅限于在视图/渲染中使用它们。

于 2013-05-26T04:27:06.547 回答
1

@language.as_json(:include => :posts) would produce what you want, I believe.

EDIT:

class Language < ActiveRecord::Base
  ...
  def to_json(opts = {})
    {self.name => self.posts}.to_json(opts)
  end
  ...
end
于 2013-05-25T23:26:00.490 回答