4

Hey I am currently working on a project that integrates Spree and Refinery. Spree suggests that many modifications are done using what they call decorators:

Refinery::Page.class_eval do

  def autocomplete_label
    title
  end

  attr_accessible :spree_taxon_id
  has_one :spree_taxon

end

This works fine. But what is the difference between just opening up the class and adding the methods directly?

class Refinery::Page

  def autocomplete_label
    title
  end

  attr_accessible :spree_taxon_id
  has_one :spree_taxon

end

I can understand that the first can be used when the class is not known until runtime (which is not needed for this use case). Are there any other differences?

4

2 に答える 2

2

私が考えることができる唯一の違いは、最初のバージョンでは既存のPageクラスが自動ロードされ、ロード後にコードが追加されることです。クラスがまだロードされておらず、2番目のバージョンを使用している場合、SpreeとRefineryが期待する自動ロード動作に干渉する可能性があり、クラスが正しくロードされない可能性があります。

于 2012-12-06T13:01:56.230 に答える
0

Spree によって提案されたクラス デコレーター パターンを使用する場合、変更は Gem のアップグレードを通じて適用されます。代わりにメソッドをクラス定義に直接追加することを選択した場合、gem を更新した瞬間にメソッドが失われます。

于 2014-08-11T13:08:51.143 に答える