2009-11-24 49 views
0

我正在使用acts_as_taggable_on宝石,并想向其中一个宝石源文件(tag.rb)添加方法,但我不想以任何方式更改宝石来源。如何在不编辑宝石来源的情况下将方法添加到红宝石宝石中?

我试图创造我自己的tag.rb文件在/app/models目录或/lib目录,然后添加到该文件所需的方法期待的是红宝石将合并这两个tag.rb文件

但当我做我得到一个NoMethodError: undefined method ...

我错过了什么?

+0

对于我未受教育的答案道歉,我点击了“删除”它,所以希望它会死于一个可怕的死亡。 我不知道重新开放Ruby的可能性,因此我的答案。 – Makis

回答

3

我认为你是对的,重新开放标签类是要走的路。除非它真的对您的代码有意义,否则我不会引入其他级别的继承。

我不确定,为什么重新打开Tag类不起作用。一些想法:

1 - 当你编写你自己的标签类,它是从ActiveRecord :: Base下降吗? Tag类作为taggable的作用,我可以看到如何忽略这可能会搞砸了。

2 - 如果我需要一个地方放置代码,重新打开一个插件类的单个方法,我可能会把它放入一个初始化文件(如config/initializers/tag_patch.rb)。只是为了保持干净。

3 - 如果一切都失败了,并且仍然无法正确重新打开Tag类(无论出于何种原因),还有其他元编程技术可能会尝试添加该方法。例如:

Tag.send(:define_method, “method_name”) do 
    #code for your method 
end 
+0

这似乎工作。我猜你的观点#2是神奇的。将代码放入初始化程序可能是我需要的(尽管我认为我可以将我的tag.rb放在/ lib中)。 – rswolff

+2

class_eval有什么问题,似乎是重新开课的更好更清晰的方式。 – nitecoder

+0

我认为railsninja是正确的,Tag.class_eval可能是最清晰的方法。当我写出define_method示例时,它不会发生。 – PreciousBodilyFluids

2

等待,你不应该添加方法到文件,但的类代替。您是否熟悉reopening the class的概念?您不能仅通过将文件命名为原始类定义的文件来添加方法。幸运的是, :)