我试图让我的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;
有关如何解决此问题的任何想法?
谢谢!
答案 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,而无需依赖活动模型序列化程序来为您完成此操作。