Rails REST API - 返回任何嵌套对象的ID而不是对象本身

时间:2016-02-25 21:42:51

标签: json rest ruby-on-rails-4

我使用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
}

我原本希望在文档中找到一个选项来添加某个地方以激活此行为,或者至少有关于自制解决方案的帖子但我没有。我很惊讶这个简单但重要的事情(至少对我来说)没有实现。

非常感谢您的帮助!

1 个答案:

答案 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