Draper::UninferrableDecoratorError(无法推断装饰器)
Draper::UninferrableDecoratorError (Could not infer a decorator)
我想在控制器中推断一个装饰器,所以我以正常方式生成一个装饰器(rails g 装饰器)并在控制器中推断它。但是,当我使用 Postman 进行测试时,出现错误:
Could not infer a decorator for Employers::Job
.
报错信息显示我在controller中的语法不正确(其中使用了.decorate
),我不知道哪里错了。
我已经尝试改变写作方式并明确指定装饰器(@job = Employers::JobDecorator.find(params[:id]).decorate
),但这又一次给出了 NoMethodError(Employers::JobDecorator:Class 的未定义方法“find”)。
这是控制器的一部分:
def show
@job = @employer.jobs.find(params[:id])
render json: @job
end
end
这是开头的装饰器:
def attributes
#somethings
end
更新 2
感谢评论中的建议,在控制器中使用 Employers::JobDecorator.decorate(@job)
后情况发生了变化,但出现了新错误。消息说 undefined method 'attributes' for nil:NilClass
,来源是来自以下文件的一行代码:
#app/decorators/employer/job_decorator.rb
def attributes
super.merge(
{
id: nil,
emp: nil,
}).delete_if { |k, v|
['class_name'].include?(k)
}
end
这是什么原因?
更新 3
按照评论的建议,将一些装饰器改成下面的,又回到了之前的错误
def attrs
model.attributes.merge(
{
错误是“NoMethodError in Employers::JobController#show”,指向的文件是“config/initializer/active_model/serialization.rb”中的其中一行(下面提取的最后一行):
module ActiveModel
module Serialization
def serializable_hash(options = nil)
options ||= {}
attribute_names = attributes.keys
更新 4
如果我改变装饰器的写法,结果仍然类似于“undefined method `id' for #Employers::JobDecorator:0x00007ff3cdd3f748”
class Employers::JobDecorator < Draper::Decorator
delegate_all
def attributes
{
id: nil,
name: nil,
slug: nil
}
end
end
更新 5
我怀疑是@job 为nil 的原因,所以我在controller 中添加了一些东西,终于解决了问题。我弄错方向了
Draper infers
被装饰对象的装饰器,在您的场景中是 Employers::Job
。
因为你要使用的装饰器有一个完全不同的名字,Api::V2::Employers::JobDecorator
,你需要明确指定它。
所以,Api::V2::Employers::JobDecorator.decorate(@job)
就是您所需要的。
更多信息,here
我想在控制器中推断一个装饰器,所以我以正常方式生成一个装饰器(rails g 装饰器)并在控制器中推断它。但是,当我使用 Postman 进行测试时,出现错误:
Could not infer a decorator for Employers::Job
.
报错信息显示我在controller中的语法不正确(其中使用了.decorate
),我不知道哪里错了。
我已经尝试改变写作方式并明确指定装饰器(@job = Employers::JobDecorator.find(params[:id]).decorate
),但这又一次给出了 NoMethodError(Employers::JobDecorator:Class 的未定义方法“find”)。
这是控制器的一部分:
def show
@job = @employer.jobs.find(params[:id])
render json: @job
end
end
这是开头的装饰器:
def attributes
#somethings
end
更新 2
感谢评论中的建议,在控制器中使用 Employers::JobDecorator.decorate(@job)
后情况发生了变化,但出现了新错误。消息说 undefined method 'attributes' for nil:NilClass
,来源是来自以下文件的一行代码:
#app/decorators/employer/job_decorator.rb
def attributes
super.merge(
{
id: nil,
emp: nil,
}).delete_if { |k, v|
['class_name'].include?(k)
}
end
这是什么原因?
更新 3
按照评论的建议,将一些装饰器改成下面的,又回到了之前的错误
def attrs
model.attributes.merge(
{
错误是“NoMethodError in Employers::JobController#show”,指向的文件是“config/initializer/active_model/serialization.rb”中的其中一行(下面提取的最后一行):
module ActiveModel
module Serialization
def serializable_hash(options = nil)
options ||= {}
attribute_names = attributes.keys
更新 4
如果我改变装饰器的写法,结果仍然类似于“undefined method `id' for #Employers::JobDecorator:0x00007ff3cdd3f748”
class Employers::JobDecorator < Draper::Decorator
delegate_all
def attributes
{
id: nil,
name: nil,
slug: nil
}
end
end
更新 5
我怀疑是@job 为nil 的原因,所以我在controller 中添加了一些东西,终于解决了问题。我弄错方向了
Draper infers
被装饰对象的装饰器,在您的场景中是 Employers::Job
。
因为你要使用的装饰器有一个完全不同的名字,Api::V2::Employers::JobDecorator
,你需要明确指定它。
所以,Api::V2::Employers::JobDecorator.decorate(@job)
就是您所需要的。
更多信息,here