众所周知,HAML翻译tr[@user]
做<tr class="user" id="user_123">...
。但它是如何实现这一目标的呢?通过一些内在的魔力?或者使用@user
对象的某些功能?
我想要实现的目标如下。我有Contact
模型,其中包含Company
和Person
子类。现在使用tr[@company]
时,我希望HAML执行以下操作:
<tr class="contact company" id="company_123">
...而不仅仅是:
<tr class="company" id="company_123">
有没有简单的方法来实现这一目标?
谢谢。
答案 0 :(得分:1)
您可以在模型中实施haml_object_ref
方法,以覆盖Haml用作class
属性值的方法。
如果你只使用Contact
的直接子类,那么简单的东西应该适用于Contact
模型:
def haml_object_ref
"#{self.class.superclass.to_s.underscore} #{self.class.to_s.underscore}"
end
(这使用ActiveSupport underscore
方法。)
如果您想直接使用Contact
个实例,或Person
或Company
的子类,您可以执行以下操作:
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"
的实例生成Contact
,class="contact person'
的实例为Person
,class="contact person employee"
为{假设的Employee
Person
} {{1}}的子类。