活动模型序列化程序 - 是否可以显示嵌入对象的URL?

时间:2014-05-22 00:19:07

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

我试图让我的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目前不会显示&#39; url&#39;访问Car时的Passenger属性(因为我怀疑,在查看通过上面的示例URL访问的Car对象的范围内,没有为Passenger定义对象&#39;

有关如何解决此问题的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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