1

我想在控制器中推断一个装饰器,所以我以正常方式生成一个装饰器(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,所以我在控制器中添加了一些东西,终于解决了问题。我把它弄错了方向。

4

1 回答 1

0

Draperinfers从被装饰的对象中装饰器,在您的场景中是Employers::Job.

因为您要使用的装饰器具有完全不同的名称,Api::V2::Employers::JobDecorator所以您需要明确指定它。

所以,Api::V2::Employers::JobDecorator.decorate(@job)是你需要的。

更多信息,在这里

于 2022-01-21T18:33:26.357 回答