我使用Ruby on Rails构建REST API,并使用Angular前端与此后端进行交互。使用了宝石rails-api。因此我只在我的请求中使用json数据,没有html。请参阅json:
关键字:
def show
@article = Article.find(params[:id])
render json: @article
end
我们说我有2个型号:
belongs_to :music
)在上一段代码中, Article 资源的GET返回这种json(简化):
{
"id":2,
"title":"A great title",
"content":"The amazing content of my article",
"music":{
"id":8,
"artist":"Pink Floyd",
"title":"Wish You Were Here"
}
}
它将包含在 Article 对象中的对象 Music 返回。这是Ruby on Rails的默认行为。但我总是听说正确的REST API应该返回嵌套资源的位置而不是资源本身。我想通过返回文章中存在的音乐的ID来遵循这个黄金法则。
我想要的是来返回音乐的id而不是整个对象,所以json响应看起来像这样:
{
"id":2,
"title":"A great title",
"content":"The amazing content of my article",
"music":8
}
我原本希望在文档中找到一个选项来添加某个地方以激活此行为,或者至少有关于自制解决方案的帖子但我没有。我很惊讶这个简单但重要的事情(至少对我来说)没有实现。
非常感谢您的帮助!
答案 0 :(得分:0)
我正在寻找的行为由Serializer处理。因此,解决方案是在相应的序列化器中指定我不想要音乐对象:
class ArticleSerializer < ActiveModel::Serializer
attributes :id, :title, :content, :created_at, :music
end
但是音乐对象的ID(:music_id
):
class ArticleSerializer < ActiveModel::Serializer
attributes :id, :title, :content, :created_at, :music_id
end