装饰实例上的未定义方法

时间:2014-08-06 15:00:06

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

这是一个装饰者

应用程序/装饰/ 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会返回未格式化的日期。

任何人都可以告诉我我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

这不是你如何使用Draper Decorator。

首先要做的事情:

  • 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