首页 文章

在JSON Rails中包含根节点

提问于
浏览
1

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

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

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

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

只需要将JSON中的语言放在其上一级 . 是不是在环境或deploy.rb中有配置来处理这个?

谢谢

3 回答

  • 1

    你为什么不使用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
    
  • 2

    如果您想在所有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
    

    OR

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

  • 1

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

    编辑:

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

相关问题