使用active-model-serializers错误地为act-as-taggable标签加载JSON

在Ruby 2 / Rails 4应用程序中,我尝试将acts-as-taggable-on与active_model_serializers结合使用,以创建一个JSON API,可以输出我的标签以及其他模型参数。

首先是这个问题的一些背景/动机:JSON正在被提供给ember / ember-data,截至本文撰写时,它已经删除了对JSON中嵌入式记录的支持。 文档中有关于此的假设修复,但我觉得它很笨拙,实际上并没有让它起作用。 由于我是一个Ember新手并且对Rails感觉更舒服,我想我会尝试以另一种方式解决问题,方法是将标记记录与文档记录一起加载。 我更喜欢这个解决方案,因为它对我的应用程序更有意义,但我也无法让它工作。

这是一个例子:假设我有一个使用act-as-taggable-on的Document模型:

class Document < ActiveRecord::Base acts_as_taggable # other code omitted 

我用一个带有一个标签的文档设置了数据库。 现在我们考虑以下情况:

1.完整对象嵌入 :使用以下序列化程序:

 class DocumentSerializer < ActiveModel::Serializer attributes :id has_many :tags 

我的JSON具有以下格式(使用Rails 4 UUID):

 { "documents": [ { "id": "c41460fa-2427-11e3-8702-0800270f33f4", "tags": [ { "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", "name": "test" } ] } ] } 

2. ID嵌入 :使用序列化器

 class DocumentSerializer < ActiveModel::Serializer attributes :id has_many :tags, embed: :id 

我的JSON现在看起来像:

 { "documents": [ { "id": "c41460fa-2427-11e3-8702-0800270f33f4", "tag_ids": [ "a33fc396-2428-11e3-8eeb-0800270f33f4" ] } ] } 

3.使用标签侧载ID :根据active_model_serializers文档,我应该能够做到

 class DocumentSerializer < ActiveModel::Serializer attributes :id has_many :tags, embed: :id, include: true 

但这不起作用。 相反,我得到一个NoMethodError:

 undefined method `object' for # 

我试过搜索这个问题,但到目前为止还没有找到任何有用的东西。 我也找不到关于任何gem的任何关于使用其他gem的文档。 我现在怀疑它与如何实现行为标签有关,它不是一个简单的has_many关系? 有人能就此问题提供一些意见吗? 提前致谢!

固定! 结果是侧载标签,必须定义相应的序列化器。 我不知道这一点,因为文档似乎暗示让序列化程序是可选的,并且在没有序列化程序的情况下会使用一些默认值。 显然,如果您希望使用include: true选项,则情况并非include: true 。 视线来自这里 ,非常感谢!

为了完整起见,我会展示我的所作所为。 我使用以下代码创建了tag_serializer.rb

 module ActsAsTaggableOn class TagSerializer < ActiveModel::Serializer attributes :id, :name end end 

现在是我的JSON:

 { "tags": [ { "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", "name": "test" } ], "documents": [ { "id": "c41460fa-2427-11e3-8702-0800270f33f4", "tag_ids": [ "a33fc396-2428-11e3-8eeb-0800270f33f4" ] } ] }