我想在控制器中推断一个装饰器,所以我以正常方式生成一个装饰器(rails g 装饰器)并在控制器中推断它。但是,当我使用 Postman 进行测试时,出现错误:
Could not infer a decorator for Employers::Job
.
错误信息显示我在控制器中的语法不正确(在哪里.decorate
使用),我不知道我哪里出错了。
我尝试过更改书写方式并明确指定装饰器@job = Employers::JobDecorator.find(params[:id]).decorate
(
这是控制器的一部分:
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
如果我更改装饰器的编写方式,结果仍然类似于“#Employers::JobDecorator:0x00007ff3cdd3f748 的未定义方法‘id’”
class Employers::JobDecorator < Draper::Decorator
delegate_all
def attributes
{
id: nil,
name: nil,
slug: nil
}
end
end
更新 5
我怀疑原因是@job为nil,所以我在控制器中添加了一些东西,终于解决了问题。我把它弄错了方向。