如何用布料器中的另一个名称装饰对象?

时间:2015-07-08 22:27:24

标签: ruby-on-rails decorator draper

这是问题

我有一个事件模型和一个用户模型。

一个Event有一个User类的创建者。我在事件模型中使用此行来关联它:

belongs_to :creator, :class_name => "User"

所以我可以通过这一行访问创建者:

event.creator

我的用户装饰器有这一行:

def full_name
    "#{first_name} #{last_name}"
end

所以我可以装饰一个User对象并访问user.full_name

但我需要装饰一个事件,并使用“decorates_association”来装饰相关的用户。所以我需要打电话给这一行:

event.creator.full_name

我试过这个:

decorates_association :creator, {with: "UserDecorator"}
decorates_association :creator, {with: "User"}

但它会抛出“未定义的方法`full_name'”错误。

如何防止此错误?

谢谢!

1 个答案:

答案 0 :(得分:1)

在您的EventDecorator课程中,您可以执行以下操作:

class EventDecorator < Draper::Decorator
  decorates_association :creator, with: UserDecorator # no quotes
  delegate :full_name, to: :creator, allow_nil: true, prefix: true
end

然后是您的用户:

class UserDecorator < Draper::Decorator
  def full_name
    "#{first_name} #{last_name}"
  end
end

然后在rails控制台中说:

ed = Event.last.decorate
ed.creator_full_name # note the underscores thanks to the delegate

# You can also do
ed.creator.full_name

在第二个示例中,如果creator为nil,则会出现找不到方法的错误。在第一个中,由于EventDecorator中委托方法的allow_nil选项,您不会收到错误,它将返回nil。