ActiveModel::Serializers Gem — проблема с пространством имен API для версии

Я новичок в Rails и модулях/пространствах имен.

Мой контроллер имеет пространство имен следующим образом:

module Api
  module V1
   class PostsController < ApiController

И ActiveModel::Serializers поместил папку «Serializers» в папку моего приложения, и в ней я создал post_serializer.rb, содержащий следующий код:

class PostSerializer < ActiveModel::Serializer
  attributes :id, :body, :category, 
end

Когда я пытаюсь получить доступ к ответу JSON, я получаю:

NameError at /api/v1/posts
uninitialized constant Api::V1::PostsController::PostSerializer

В чем проблема и как лучше всего использовать пространство имен для моих сериализаторов вместе с моими версиями API?


person ac360    schedule 17.03.2013    source источник
comment
Обязательно перезагрузите сервер после настройки сериализатора. Перезапуск сервера с помощью rails restart в моем случае не работал, но перезапуск с помощью ctrl+c на терминале сервера работал.   -  person ToTenMilan    schedule 12.04.2019


Ответы (1)


имейте в виду, что пространства имен должны соответствовать структуре папок:

# should be in app/controllers/api/v1/posts_controller.rb
module Api
  module V1
   class PostsController < ApiController

# should be in app/serializers/post_serializer.rb
class PostSerializer < ActiveModel::Serializer

при использовании PostSerializer без префикса предполагается текущее пространство имен. если вы ссылаетесь на глобальное пространство имен, используйте ::PostSerializer

person phoet    schedule 17.03.2013
comment
Стоит отметить, что сериализаторы ActiveModel действительно не любят пространства имен, потому что сериализаторы связаны с моделями (а не с представлениями или конечными точками), а модели обычно не имеют версий. Я не уверен, что согласен с этим решением, но так решила основная команда. - person Intentss; 23.04.2014
comment
@Intentss Интересно, а есть ли тогда какой-нибудь способ их пространства имен для управления версиями? - person geoboy; 07.09.2017