无法访问 V1::JobsController 内的 V1::JobSerializer

Can't access V1::JobSerializer inside of V1::JobsController

我在我的 Rails API 项目中使用 ActiveModelSerializers gem。

由于 API 版本控制,我在 app/controllers/v1/jobs_controller.rb 内部创建了一个 JobsController

我还在 app/serializers/v1/job_serializer.rb 内部创建了一个 JobSerializer 也是因为 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)

当我尝试 return 时它说 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

在声明嵌套的 类 / 模块时,决不应使用范围解析运算符 ::。始终使用显式嵌套:

# 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/class 并设置了正确的模块嵌套,以便在同一模块中解析常量:

module B
  class C
    puts A # outputs "I'm in B"
    puts D # outputs "Hello"
  end
end