什么是ruby decorators和class eval之间的区别?

时间:2012-12-06 09:04:13

标签: ruby-on-rails ruby ruby-on-rails-3

嘿,我目前正在开发一个集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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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