我正在使用acts_as_taggable_on
寶石,並想向其中一個寶石源文件(tag.rb
)添加方法,但我不想以任何方式更改寶石來源。如何在不編輯寶石來源的情況下將方法添加到紅寶石寶石中?
我試圖創造我自己的tag.rb文件在/app/models
目錄或/lib
目錄,然後添加到該文件所需的方法期待的是紅寶石將合併這兩個tag.rb文件
但當我做我得到一個NoMethodError: undefined method
...
我錯過了什麼?
我正在使用acts_as_taggable_on
寶石,並想向其中一個寶石源文件(tag.rb
)添加方法,但我不想以任何方式更改寶石來源。如何在不編輯寶石來源的情況下將方法添加到紅寶石寶石中?
我試圖創造我自己的tag.rb文件在/app/models
目錄或/lib
目錄,然後添加到該文件所需的方法期待的是紅寶石將合併這兩個tag.rb文件
但當我做我得到一個NoMethodError: undefined method
...
我錯過了什麼?
我認爲你是對的,重新開放標籤類是要走的路。除非它真的對您的代碼有意義,否則我不會引入其他級別的繼承。
我不確定,爲什麼重新打開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
這似乎工作。我猜你的觀點#2是神奇的。將代碼放入初始化程序可能是我需要的(儘管我認爲我可以將我的tag.rb放在/ lib中)。 – rswolff
class_eval有什麼問題,似乎是重新開課的更好更清晰的方式。 – nitecoder
我認爲railsninja是正確的,Tag.class_eval可能是最清晰的方法。當我寫出define_method示例時,它不會發生。 – PreciousBodilyFluids
等待,你不應該添加方法到文件,但的類代替。您是否熟悉reopening the class的概念?您不能僅通過將文件命名爲原始類定義的文件來添加方法。幸運的是, :)
對於我未受教育的答案道歉,我點擊了「刪除」它,所以希望它會死於一個可怕的死亡。 我不知道重新開放Ruby的可能性,因此我的答案。 – Makis