0

这是问题

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

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

belongs_to :creator, :class_name => "User"

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

event.creator

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

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

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

但我需要装饰一个事件,并使用“decorates_association”来装饰关联的用户。所以我需要调用这条线:

event.creator.full_name

我试过这个:

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

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

我怎样才能防止这个错误?

谢谢!

4

1 回答 1

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。

于 2015-07-21T23:41:02.003 回答