在 Ruby 2/Rails 4 应用程序中,我尝试将 act-as-taggable-on 与 active_model_serializers 结合使用,以创建一个 JSON API,该 API 将输出我的标签以及其他模型参数。
首先是这个问题的一些背景/动机:JSON 被输入到 ember/ember-data 中,截至撰写本文时,它已经删除了对 JSON 中嵌入记录的支持。文档中有一个关于此的假设修复,但我发现它很笨拙,也没有真正让它工作。由于我是 Ember 新手,并且对 Rails 更熟悉一点,我想我会尝试用另一种方式解决这个问题,即在文档记录旁边加载标签记录。我更喜欢这个解决方案,因为它对我的应用程序更有意义,但我也无法让它工作。
下面是一个例子:假设我有一个使用acts-as-taggable-on的文档模型:
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 Embed with Tags Sideloaded:根据active_model_serializers文档,我应该可以做到
class DocumentSerializer < ActiveModel::Serializer
attributes :id
has_many :tags, embed: :id, include: true
但这不起作用。相反,我得到一个 NoMethodError:
undefined method `object' for #<ActsAsTaggableOn::Tag:0x007f258cf1db38>
我试过搜索这个问题,但到目前为止还没有发现任何有用的东西。我也找不到任何关于与其他 gem 一起使用的 gem 的文档。我现在怀疑它与acts-as-taggable-on 的实现方式有关,它不是一个简单的 has_many 关系?有人能就这个问题提供一些意见吗?提前致谢!