这是问题
我有一个事件模型和一个用户模型。
一个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'”错误。
如何防止此错误?
谢谢!
答案 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。