7

在 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 关系?有人能就这个问题提供一些意见吗?提前致谢!

4

1 回答 1

12

固定的!原来要侧载标签,必须定义相应的序列化程序。我不知道这一点,因为文档似乎暗示有一个序列化程序是可选的,并且在没有序列化程序的情况下将使用一些默认值。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"
         ]
      }
   ]
}
于 2013-10-24T22:29:21.247 回答