неинициализированная константа API :: V1 :: ApplicationSerializer - PullRequest
1 голос
/ 12 апреля 2020

Я начал использовать gem 'active_model_serializers', '~> 0.10.0'. Следующий это документ для реализации.

У меня есть следующие отношения.

landmark has_many concerns
concern belongs_to landmark
concern has_many comments 

Я создал ApplicationSerializer в app/serializers/api/application_serializer.rb

module API
  class ApplicationSerializer < ActiveModel::Serializer
     # some commode here
  end
end

Мой концерн_сериализатор содержит:

# ===> Does not work <=====
module API::V1
  class ConcernSerializer < ApplicationSerializer
    attributes :id, :body
    has_many :comments
    belongs_to :landmark

    class CommentSerializer < ApplicationSerializer
      attributes :id, :body
    end

    class LandmarkSerializer < ApplicationSerializer
      attributes :id, :short_address
    end

  end
end


# ====> However, this works <====
module API::V1
  class ConcernSerializer < ApplicationSerializer
    attributes :id, :body
    has_many :comments

    class CommentSerializer < ActiveModel::Serializer
      attributes :id, :body
    end

  end
end

# ===> Does not work again<=====
module API::V1
  class ConcernSerializer < ApplicationSerializer
    attributes :id, :body
    has_many :comments
    belongs_to :landmark

    class CommentSerializer < ActiveModel::Serializer
      attributes :id, :body
    end

    class LandmarkSerializer < ActiveModel::Serializer
      attributes :id, :short_address
    end

  end
end

В приведенном выше коде, если я заменю ApplicationSerializer на ActiveModel::Serializer, он работает нормально, но я теряю общий код, определенный в ApplicationSerializer.

1 Ответ

0 голосов
/ 12 апреля 2020

Похоже на проблему автозагрузки. ApplicationSerializer должен быть в своем собственном файле <serializers directory>/api/application_serializer.rb (обязательно перезапустите сервер / пружину после создания каталогов в app, чтобы они были загружены автозагрузчиком)

Также вы можете обратиться к нему, используя абсолютное имя класса: ::API::ApplicationSerializer

...