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
我为一个 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