1

我为 Rails 项目设置了 Draper 的装饰器来替换原来的助手。我将帮助代码移至装饰器:

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

并在 View 中添加.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}"

我该如何解决这些错误?

4

1 回答 1

1

ArgumentError是因为您birthday在没有传入 a 的情况下调用date
这样做<%= user.decorate.birthday(Date.current) %>会使错误消失。

但是,这可能不是您想要的,因为dateUser模型中已定义。

装饰东西的最简单方法是使用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.

另一种方法是调用模型对象上的方法:

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

  def birthday
   "MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
  end
end
于 2021-12-14T07:22:41.647 回答