2

众所周知,HAML 翻译tr[@user]为 do <tr class="user" id="user_123">...。但它是如何做到这一点的呢?通过一些内在的魔法?或者使用@user对象的某些功能?

我想要实现的是以下。我有一个Contact带有 aCompany和一个Person子类的模型。现在使用 时tr[@company],我希望 HAML 执行以下操作:

<tr class="contact company" id="company_123">

...而不仅仅是:

<tr class="company" id="company_123">

有没有简单的方法来实现这一目标?

谢谢你。

4

1 回答 1

1

您可以haml_object_ref在模型中实现一个方法来覆盖 Haml 用作class属性值的内容。

如果你只使用Contact像这样简单的东西的直接子类应该在你的Contact模型中工作:

def haml_object_ref
  "#{self.class.superclass.to_s.underscore} #{self.class.to_s.underscore}"
end

(这使用 ActiveSupportunderscore方法。)

如果您想Contact直接使用实例或 or 的子类PersonCompany您可以执行以下操作:

def haml_object_ref
  classes = []
  klass = self.class
  while klass <= Contact
    classes << klass
    klass = klass.superclass
  end
  classes.map{|c| c.to_s.underscore}.join(' ')
end

这将为class="contact"的实例Contactclass="contact person'的实例Personclass="contact person employee"的(假设的)Employee子类生成Person

于 2013-03-18T15:45:29.333 回答