我为Rails项目设置了Draper‘set来替换原来的助手。我将助手代码移至Decorator:
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}"我如何纠正这些错误?
发布于 2021-12-14 07:22:41
引发该ArgumentError是因为您调用birthday而不传入date。
执行<%= user.decorate.birthday(Date.current) %>将使错误消失。
但是,这可能不是您想要的,因为date是在User模型中定义的。
装饰东西的最简单的方法是使用全。它将使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
endhttps://stackoverflow.com/questions/70344811
复制相似问题