2012-01-05 86 views
3

好吧,我有一個軌道寶石,我正在工作,我希望它覆蓋在鏈輪的特定方法。覆蓋另一個寶石中的寶石方法

我想重寫的方法是:Sprockets::Base.digest,這樣我就可以在編譯應用程序的資產時將指紋從我的寶石版本中刪除。

我該怎麼做呢?

在我的寶石,我創建一個文件的lib /鏈輪/ base.rb,並把下面的代碼:

 
class Sprockets::Base                                                               
    def digest 
    @digest = digest_class.new.update(MyGem::VERSION) 
    @digest.dup 
    end 
end 

當我運行bundle exec rake assets:precompile我得到:

undefined method 'logger=' for #<Sprockets::Environment:0x1315b040>

所以幾乎在我看來,整個班級以某種方式被重寫(這會失去它和其他方法),而不僅僅是重寫一種方法。

如果我將這段代碼直接包含到使用這兩個gem的應用程序的rake文件中,那麼這些工作完美無缺。

+0

這是環境和索引的基類,因此您可能需要重新初始化它們? https://github.com/sstephenson/sprockets/blob/477c40915e00e752c473011ffb67842a550ae782/lib/sprockets/index.rb#L22 – 2012-01-05 01:31:58

回答

6

以這種方式覆蓋整個Ruby類是不可能的,但我認爲可能會阻止原始類加載...如果它使用自動加載。我很好奇,所以我檢查了https://github.com/sstephenson/sprockets/blob/master/lib/sprockets.rb,是的,Sprockets正在使用自動加載。

autoload :Base, "sprockets/base" 

重要的是,該負載的代碼。它只是告訴Ruby,如果遇到一個名爲「Sprockets :: Base」的未定義的常量,可以從指定的文件中加載它。您的補丁在任何地方被調用之前就定義了Sprockets :: Base,從而阻止加載原始文件。

當你將你的補丁移動到Rakefile時,Rails中的某些東西已經引用了Sprockets :: Base,加載了原始代碼。然後將您的修補程序清潔地應用在頂部。

我從來沒有真正使用自動加載,所以我不知道這樣的情況應該如何處理。我打賭雖然,這將工作:

Sprockets::Base 
class Sprockets::Base 
    def digest 
... 

通過先引用類,你應該強制紅寶石加載原始類。然後,您可以放心地開展重寫其中一種方法的業務。

+0

太棒了,這看起來像票!明天當我回來看看時,我會試試這個鏡頭,並希望標記出答案。謝謝您的幫助! – ifightcrime 2012-01-05 05:05:30

+0

我在應用程序端獲得'未初始化的常量Sprockets :: Base',但它似乎仍然在寶石方面工作正常。根據http://ablogaboutcode.com/2011/01/17/ruby​​-autoloading-解釋/它應該仍然工作。我甚至在頂部扔了一個「需要」的鏈輪「',它仍然彈出。 – ifightcrime 2012-01-05 17:23:30

+0

這似乎很奇怪。是否定義了「Sprockets」? – bioneuralnet 2012-01-05 20:41:06

1

好吧,我標記你的答案是正確的,但它真的只是讓我找出問題。

無論如何,rails應用程序需要我的基本文件,而不是gem本身的文件。這就是你說的。然而,它發生的原因似乎是由路徑本身造成的。文件的路徑基本上與gem(lib/sprockets/base.rb)相同。

將該文件移動到我的gem的「命名空間」(lib/my_gem而不是lib/sprockets)中,並將其重命名爲sprockets_base.rb修復了問題!奇怪,是吧?

換句話說,我試圖保持好的目錄結構似乎混淆了Rails認爲它是寶石本身或其他東西。

+0

很好的結果。這讓我更加猶豫,比我以後在使用自動加載時更加猶豫... – bioneuralnet 2012-01-05 22:06:21

+0

我認爲這一切都只是爲了理解rails如何初始化應用程序。我顯然不這樣做。如果rails有'init'日誌或其他東西,那將會很棒。感謝您的幫助。 – ifightcrime 2012-01-09 20:30:32

+1

這是非常詳細的,但如果你還沒有看到它,可能會給你一些Rails初始化過程的見解。 http://guides.rubyonrails.org/initialization.html – bioneuralnet 2012-01-09 20:54:14