无法访问 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
我在我的 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