首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails Draper's Decorator引起的ArgumentError

Rails Draper's Decorator引起的ArgumentError
EN

Stack Overflow用户
提问于 2021-12-14 06:57:09
回答 1查看 66关注 0票数 1

我为Rails项目设置了Draper‘set来替换原来的助手。我将助手代码移至Decorator:

代码语言:javascript
复制
def birthday(date)
  "MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
end

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

代码语言:javascript
复制
<%= user.decorate.birthday %>

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

代码语言:javascript
复制
def birthday(date)

如果删除第一次约会,它将显示为NoMethodError undefined method 'date' for #<UserDecorator:0x000055570cbafc58>

代码语言:javascript
复制
"MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"

我如何纠正这些错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 07:22:41

引发该ArgumentError是因为您调用birthday而不传入date

执行<%= user.decorate.birthday(Date.current) %>将使错误消失。

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

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

代码语言:javascript
复制
class UserDecorator < Draper::Decorator
  delegate_all
  
  def birthday
   "MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
  end
end

请注意,在装饰器中声明的任何方法都将覆盖模型中声明的方法,在您的例子中是birthday。例如,如果在装饰器中有其他调用birthday的方法,那么它将使用装饰器中的方法,而不是模型中的方法,模型可以通过调用model.birthday来使用。

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

代码语言:javascript
复制
class UserDecorator < Draper::Decorator
  def date
    model.date
  end

  def birthday
   "MinYear#{date.year - 1911} Month#{date.month} Day#{date.day}"
  end
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70344811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档