【问题标题】:Add nested fields in JSON output in Rails controller在 Rails 控制器的 JSON 输出中添加嵌套字段
【发布时间】:2014-02-11 23:13:06
【问题描述】:

在标准 Rails 控制器的末尾有:

respond_to do |format|
  format.html
  format.json { render json: @cars }
end

按预期工作。除了 JSON 没有 @cars 的关联:

class Car < ActiveRecord::Base
  attr_accessible :model, :color
  belongs_to :manufacturer
end

JSON 没有制造商的字段。我如何让 JSON 拥有这些?我在belongs_to 通话中添加了什么内容吗?有没有办法可以将它添加到从format.json 创建的对象中?

【问题讨论】:

    标签: ruby-on-rails json ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


    【解决方案1】:

    默认情况下,as_json,将对象转换为 JSON 的方法包括所有属性。但是manufacturer 是一种方法。

    您可以指示as_json 将制造商包含在选项:methods 中,请参阅api doc

    所以你的Car 模型可能看起来像

    class Car < ActiveRecord::Base
      belongs_to :manufacturer
    
      def as_json(options={})
        super(options.merge methods: :manufacturer_json)
      end
    
      def manufacturer_json
        manufacturer.as_json
      end
    end
    

    包括制造商。

    【讨论】:

    • 这回答了我的问题,但适用于所有Cars。有没有办法仅针对特定控制器执行此操作?
    • 不适合我,我看不到任何额外的字段。我要从manufacturer_json 回来{name: 'abcdef'}.as_json。但是 JSON 和之前一模一样,没有name 字段。
    • 嗯,突然开始工作,可能是缓存问题。
    • 您可以将as_json 定义放在Car 中并在控制器中设置选项:render json: @cars.map{|c| c.as_json(methods:manufacturer_json)}
    • 这听起来很完美@MartinM,我可以传递 JSON 字符串数组而不是 Car 对象似乎很奇怪。
    【解决方案2】:

    我最喜欢的方法是使用Active Model Serializer gem. 使用自定义序列化程序,您可以实现几乎任何您想要的 JSON 结构,除了使用 Active Model Serializer 进行 Has Many Through 关联,即目前正在大修中。

    您可能想看看一些教程,例如http://robots.thoughtbot.com/fast-json-apis-in-rails-with-key-based-caches-and

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      相关资源
      最近更新 更多