【问题标题】:undefined method on decorated instance装饰实例上的未定义方法
【发布时间】:2014-08-06 15:00:05
【问题描述】:

这是一个装饰器

app/decorators/campaign_decorator.rb

class CampaignDecorator < Draper::Decorator
  delegate_all Campaign::Campaign

  def created_at
    helpers.content_tag :span, class: 'time' do
      object.created_at.strftime("%a %m/%d/%y")
    end
  end

  def custom_method
    'hello there!'
  end
end

当我调用CampaignDecorator.custom_method 时,它找不到方法。同样CampaignDecorator.first.created_at 返回未格式化的日期。

谁能告诉我我错过了什么?

【问题讨论】:

  • 我不知道 Draper,但可以肯定的是,您的 custom_method 被定义为实例方法,但您在类级别调用它(没有任何 CampaignDecorator 实例)。

标签: ruby-on-rails ruby-on-rails-3 activerecord draper


【解决方案1】:

这不是您使用 Draper 装饰器的方式。

第一件事:

  • CampaignDecorator.custom_method 尝试在 CampaignDecorator 类中查找名为 custom_method 的类方法。这绝对不是你想要的。

  • CampaignDecorator.first.created_at 查找 CampaignDecorator 类的对象并在那里操作(没有记录,所以 first 返回 nil)

您需要做的实际上是装饰您的模型。检查documentation

您首先需要将功能添加到您的模型中:

class CampaignDecorator
  decorates :campaign
end

总之你可以做到

@campaign = Campaign.first.decorate

@campaigns = CampaignDecorator.decorate_collection(Campaign.all)

@campaigns = Campaign.scoped.decorate

【讨论】:

  • 我在文档和 Railscasts(bit.ly/1zW1RqA) 中找不到任何提及在 AR 模型中包含装饰器的参考资料。无论如何,如果我尝试在模型中包含装饰器,我尝试了你的方法并得到 NameError: uninitialized constant Decorators 错误。您提到在CampaignDecorator.first.created_at 中,first 将返回 nil。但事实并非如此。这个 sn-p 返回原始日期而不是格式化日期。
  • Campaign.first.decorate 在 AR 中不需要 include Decorators::CampaignDecorator 即可工作。我在railscast之后使用CampaignDecorator.first,其中装饰器用于查找@user = UserDecorator.find(params[:id])之类的记录。虽然CampaignDecorator.first 返回了正确的 AR 模型,但它并没有装饰它。
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 2019-01-03
  • 2020-01-19
  • 2019-02-03
相关资源
最近更新 更多