Rails Draper 的装饰器导致 ArgumentError

Rails Draper's Decorator caused ArgumentError

我为一个 Rails 项目设置了 Draper 的装饰器来替换原来的助手。我将辅助代码移到了装饰器中:

def birthday(date)
  "MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
end

并在视图中添加 .decorate 文本以使用它

<%= user.decorate.birthday %>

但是,这会导致 ArgumentError wrong number of arguments (given 0, expected 1)

def birthday(date)

如果我删除第一个日期,它将显示 NoMethodError undefined method 'date' for #<UserDecorator:0x000055570cbafc58>

"MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"

如何修复这些错误?

引发 ArgumentError 是因为您在调用 birthday 时未传入 date
执行 <%= user.decorate.birthday(Date.current) %> 将使错误消失。

但是,这可能不是您想要的,因为 date 是在 User 模型中定义的。

最简单的装饰方法是使用 delegate_all。它将使 User 模型中的所有方法在装饰器中可用。

class UserDecorator < Draper::Decorator
  delegate_all
  
  def birthday
   "MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
  end
end

请注意,装饰器中声明的任何方法都将覆盖模型中声明的方法,在您的情况下 birthday。例如,如果您在装饰器中有其他调用 birthday 的方法,它将使用来自装饰器的方法,而不是来自模型的方法,后者可以通过调用 model.birthday.[=24= 获得。 ]

另一种方法是在 model 对象上调用方法:

class UserDecorator < Draper::Decorator
  def date
    model.date
  end

  def birthday
   "MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
  end
end