Не удается получить доступ к V1 :: JobSerializer внутри V1 :: JobsController - PullRequest
1 голос
/ 28 мая 2020

Я использую гем ActiveModelSerializers в моем проекте Rails API.

Я создал JobsController внутри app/controllers/v1/jobs_controller.rb из-за управления версиями API.

Я также создал JobSerializer внутри app/serializers/v1/job_serializer.rb также из-за управления версиями API.

Когда я пытаюсь получить доступ к V1::JobSerializer внутри контроллера следующим образом:

  def today_jobs 
    todays_jobs = Job.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).all.order('created_at DESC').page(params[:page] ? params[:page].to_i : 1).per(10)

    render json: {objects: ActiveModel::Serializer::CollectionSerializer.new(todays_jobs, each_serializer: V1::JobSerializer), meta: pagination_meta(todays_jobs)}
  end

Не обращайте внимания на разбиение на страницы, это часть важна:

objects: ActiveModel::Serializer::CollectionSerializer.new(todays_jobs, each_serializer: V1::JobSerializer)

Когда я пытаюсь вернуть это, он говорит uncaught throw :no_serializer, потому что я думаю, что он не знает, что такое V1::JobSerializer.

Просто чтобы убедиться: jobs_controller.rb определяется так:

class V1::JobsController < ApplicationController
end

и job_serializer.rb определяется так:

class V1::JobSerializer < ActiveModel::Serializer
end

Что мне делать, чтобы иметь доступ к V1::JobSerializer внутри моих заданий контроллер?

1 Ответ

4 голосов
/ 29 мая 2020

Оператор разрешения области видимости :: никогда не должен использоваться при объявлении вложенных классов / модулей. Всегда используйте явное вложение:

# Bad:
class V1::JobsController < ApplicationController
  puts JobSerializer.inspect # missing constant error
end

class V1::JobSerializer < ActiveModel::Serializer
end
# Good:
module V1
  class JobsController < ApplicationController
    puts JobSerializer.inspect # resolves to V1::JobSerializer 
  end
end

module V1
  class JobSerializer < ActiveModel::Serializer
  end
end

Почему? Потому что, когда вы используете оператор разрешения области видимости, вложение модулей разрешается в место определения. И это может привести к чрезвычайно неожиданному поиску констант:

A = "I'm in the main scope"

module B
  A = "I'm in B"
  D = "Hello"
end

class B::C 
  puts A # outputs "I'm in the main scope"
  puts D # Missing constant error
end

Когда вы используете явное вложение, вы фактически повторно открываете модуль / класс и устанавливаете правильное вложение модулей, чтобы константы разрешались в одном модуле:

module B
  class C
    puts A # outputs "I'm in B"
    puts D # outputs "Hello"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...