4

嘿,我目前正在做一个整合 Spree 和 Refinery 的项目。Spree 建议使用他们所谓的装饰器完成许多修改:

Refinery::Page.class_eval do

  def autocomplete_label
    title
  end

  attr_accessible :spree_taxon_id
  has_one :spree_taxon

end

这工作正常。但是直接打开类和直接添加方法有什么区别呢?

class Refinery::Page

  def autocomplete_label
    title
  end

  attr_accessible :spree_taxon_id
  has_one :spree_taxon

end

我可以理解,当类直到运行时才知道时,可以使用第一个(这个用例不需要)。还有其他区别吗?

4

2 回答 2

2

我能想到的唯一区别是第一个版本将导致它自动加载现有的 Page 类,然后在加载后添加您的代码。如果该类尚未加载,而您使用第二个版本,它可能会干扰 Spree 和 Refinery 所期望的自动加载行为,并且该类可能无法正确加载。

于 2012-12-06T13:01:56.230 回答
0

如果您使用 Spree 建议的类装饰器模式,那么您的更改将通过 Gem 的升级而生效。如果您选择将您的方法直接添加到类定义中,那么在您更新 gem 时它们将丢失。

于 2014-08-11T13:08:51.143 回答