2

ご存知のように、HAMLはtr[@user]doを変換します<tr class="user" id="user_123">...。しかし、それはどのようにこれを達成するのでしょうか?いくつかの内部魔法を通して?または、@userオブジェクトのいくつかの機能を使用していますか?

私が達成したいのは次のとおりです。とサブクラスを持つContactモデルがあります。を使用する場合、HAMLで次のことを実行したいと思います。CompanyPersontr[@company]

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

...だけでなく:

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

これを達成する簡単な方法はありますか?

ありがとうございました。

4

1 に答える 1

1

モデルにメソッドを実装して、haml_object_refHamlがclass属性の値として使用するものをオーバーライドできます。

Contactこのような単純なものの直接サブクラスのみを使用する場合は、Contactモデルで機能するはずです。

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

(これはActiveSupportunderscoreメソッドを使用します。)

インスタンスを直接使用する場合、またはまたはのサブクラスを使用する場合Contactは、次のようにすることができます。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'のインスタンス、Personおよびclass="contact person employee"の(仮想の)Employeeサブクラスが生成されますPerson

于 2013-03-18T15:45:29.333 に答える