В приложении Ruby 2/Rails 4 я пытаюсь использовать act-as-taggable-on в сочетании с active_model_serializers, чтобы создать JSON API, который будет выводить мои теги вместе с другими параметрами модели.
Сначала немного предыстории/мотивации для этой проблемы: JSON загружается в ember/ember-data, который на момент написания этой статьи удалил поддержку встроенных записей в JSON. В документации есть предполагаемое исправление, но мне оно кажется неуклюжим. а также на самом деле не заставил его работать. Поскольку я новичок в Ember и мне немного удобнее работать с Rails, я думаю, что попытаюсь решить проблему другим способом, загрузив запись тега вместе с записью документа. Мне это решение нравится больше, потому что оно лучше подходит для моего приложения, но я тоже не могу заставить его работать.
Вот пример: допустим, у меня есть модель документа, в которой используются действия как теги:
class Document < ActiveRecord::Base
acts_as_taggable
# other code omitted
Я создал базу данных с одним документом с одним тегом. Теперь рассмотрим следующие случаи:
<сильный>1. Полное встраивание объекта: со следующим сериализатором:
class DocumentSerializer < ActiveModel::Serializer
attributes :id
has_many :tags
Мой JSON имеет следующий формат (с использованием UUID Rails 4):
{
"documents": [
{
"id": "c41460fa-2427-11e3-8702-0800270f33f4",
"tags": [
{
"id": "a33fc396-2428-11e3-8eeb-0800270f33f4",
"name": "test"
}
]
}
]
}
<сильный>2. Встраивание идентификатора: использование сериализатора
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. Внедрение идентификатора с загруженными тегами: согласно документации active_model_serializers, я должен быть в состоянии сделать
class DocumentSerializer < ActiveModel::Serializer
attributes :id
has_many :tags, embed: :id, include: true
но это не работает. Вместо этого я получаю NoMethodError:
undefined method `object' for #<ActsAsTaggableOn::Tag:0x007f258cf1db38>
Я пытался найти эту проблему, но пока не нашел ничего полезного. Я также не смог найти никакой документации ни по одному драгоценному камню, касающемуся использования с другим драгоценным камнем. Мое подозрение прямо сейчас, что это как-то связано с тем, как реализованы действия как пометки, что это не прямое отношение has_many? Кто-нибудь может предложить какой-то вклад по этому вопросу? Заранее спасибо!