【问题标题】:Active Model Serializers - Is it possible to show the URL for an embedded object?活动模型序列化器 - 是否可以显示嵌入对象的 URL?
【发布时间】:2014-05-22 00:19:07
【问题描述】:

我正在尝试使我的 API 高度连接/可抓取,因此我希望所有嵌入式对象关联都返回关联对象的 URL,以及关联对象的 ID 和属性。

例如给出:

class Car < ActiveModel::Serializer
  attributes :id, :make, :model, :url
  has_many :passengers

  def url
    car_url(object)
  end
end

class Passenger < ActiveModel::Serializer
  attributes :id, :name, :url

  def url
    passenger_url(object)
  end
end

我希望http://api.approot.com/car/3.json 返回如下内容:

{        
  - car: {
      id: 3,
      make: 'Ford',
      model: 'F150',
      url: 'http://api.approot.com/car/3.json',
    - passengers: [
        - {
             id: 7,
             name: 'Bill',
             url: 'http://api.approot.com/passengers/7'
           },
        - {
             id: 13,
             name: 'Will',
             url: 'http://api.approot.com/passengers/13'
          }
      ]
    }
}

然而,鉴于此实现,ActiveModel::Serializers 当前不会在您访问 Car 时显示 Passenger 的 'url' 属性(因为我怀疑在查看访问的 Car 对象的范围内没有为 Passenger 定义 'object'通过上面的示例 URL)。

关于如何解决这个问题的任何想法?

谢谢!

【问题讨论】:

    标签: ruby-on-rails api active-model-serializers


    【解决方案1】:

    由于您不在视图/控制器的上下文中,您可能需要将 :host 选项传递给您的 *_url 方法。

    def url
      car_url(object, host: "api.approot.com")
    end
    

    【讨论】:

    • 我不这么认为。当您访问 api.approot.com/car/3.json 时,该 URL 将为 Car 对象正确呈现。核心问题是当 Car 对象被序列化时,Passenger 对象超出范围......
    【解决方案2】:

    这是解决此问题的 DIY 方法。在模型上创建一个字段来存储 url。然后在保存对象后,使用手动生成的 url 更新它。 这是我解决它的方法。

    if @questionsolution.save
    generatedurl = 'http://localhost:3000/questionsolutions/' + @questionsolution.id.to_s
    @questionsolution.update(solutionurl: generatedurl)
    end
    

    然后您可以从资源直接获取 url,而无需依赖活动模型序列化程序来为您完成。

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      相关资源
      最近更新 更多