2009-11-24 47 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的概念?您不能僅通過將文件命名爲原始類定義的文件來添加方法。幸運的是, :)