Ошибка загрузки неопубликованного JSON для тегов, которые можно использовать в качестве тегов, с использованием сериализаторов активной модели.

В приложении 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? Кто-нибудь может предложить какой-то вклад по этому вопросу? Заранее спасибо!


person xph    schedule 24.10.2013    source источник
comment
Могу я спросить вас, как управлять отношениями с Ember? Как добавить тег в документ? Создать запись?   -  person    schedule 30.05.2017


Ответы (1)


Фиксированный! Оказывается, чтобы загрузить теги, должен быть определен соответствующий сериализатор. Я этого не знал, потому что в документации, похоже, подразумевается, что наличие сериализатора необязательно, и при его отсутствии будет использоваться некоторый вариант по умолчанию. Очевидно, это не тот случай, если вы хотите использовать опцию 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"
         ]
      }
   ]
}
person xph    schedule 24.10.2013
comment
также не забудьте сохранить tag_serializer.rb в app/serializers/acts_as_taggable_on/tag_serializer.rb, чтобы Rails мог автоматически загружать его. - person davekaro; 29.10.2014
comment
У меня это работает, но мне нужно удалить этот модуль ActsAsTaggableOn - person buncis; 20.04.2017