如何在关联对象中包含draper装饰器

时间:2013-07-08 07:31:02

标签: ruby-on-rails model decorator draper

我正在使用Draper将装饰器添加到多个模型中,我有一些装饰器用于一个模型(我的文档模型),我想用它来“装饰”另一个模型(我的用户模型)。我怎样才能做到这一点?

我已经尝试将它放在我的文档装饰器中,但它不起作用。

decorates_association :user

**[decorators here]**

class UserDecorator < ApplicationDecorator
  decorates :user
end

并将其添加到我的用户控制器:

def show
  @user = UserDecorator.find(params[:id])
end

提前谢谢!

2 个答案:

答案 0 :(得分:1)

看起来您已经设置了ApplicationDecorator。如果您想在模型之间共享装饰器方法,可以将它们包含在ApplicationDecorator中,如下所示:

class ApplicationDecorator < Draper::Decorator
  def name
    model.name
  end

  def created
    model.created_at.strftime("%m/%d/%Y")
  end
end

如果你像这样设置UserDecorator和DocumentDecorator:

class UserDecorator < ApplicationDecorator
  delegate_all
end

class DocumentDecorator < ApplicationDecorator
  delegate_all
end

然后,ApplicationDecorator中定义的任何装饰器方法(名称,创建等)都可用于装饰用户和装饰文档。

我们有几个项目,我们使用类似的设置在多个模型之间共享装饰器方法,以获取日期和时间格式,状态等常见属性。希望这会有所帮助。

答案 1 :(得分:0)

您不想与其共享逻辑的其他模型可以直接从 Draper :: Decorator 继承,而不是从 ApplicationDecorator 继承。 只有5个模型应该继承自 ApplicationDecorator

@kovpack