我想使用導軌熟悉的助手,但功能稍有變化。我看到它的方式,我希望能夠做一些事情,如:覆蓋導軌助手訪問原始
module AwesomeHelper
#... create alias of stylesheet_link_tag to old_stylesheet_link_tag
def stylesheet_link_tag(*args)
if @be_awesome
awesome_stylesheet_link_tag *args
else
old_stylesheet_link_tag *args
end
end
end
我看到它的方式,我有三種選擇:
- 猴子補丁:重新打開軌道助手模塊。如果Rails團隊改變了他們的幫手模塊的名字,我的代碼就變成了脆弱的源泉。不是無法克服的,但並不理想。
- 使用不同的方法名稱:試圖堅持共軌接口可能是我的失敗。我的更改可能會成爲其他開發人員混淆的來源
- 分離方法(新):不確定這是否可行,或者它是否與1具有相同的缺點。是否會研究此問題,但這可能是一個好結果初始點。
所以這裏的問題是,我堅持這些次優解決方案之一,還是有另一種方式,我沒有考慮?如果我去選項3,有沒有辦法做到這一點,而不直接處理鐵軌輔助模塊?
(注:我已刪除的背景下,因爲它增加了沒什麼問題)
你知道嗎......這太瘋狂了,我試圖絞盡腦汁想出爲什麼我認爲這是行不通的!我今晚會嘗試它,如果它有效,我會用我的大腦說一些嚴厲的話,可能涉及到一堵磚牆。當然,接受你的答案後......:D – user208769
@ user208769 Hehehe。棒極了。據我所知,在任何情況下,這種方式的優先方法通常是優選的。 [Class#ancestors](http://ruby-doc.org/core-1.9.3/Module.html#method-i-store)在確定劫持方法的方法查找路徑中的一個好位置方面確實很有幫助調度(或者您的自定義模塊與覆蓋需要包含在最好的效果)。 – Cade
什麼? :) 你在開玩笑吧!這是一個巨大的困擾!你的方式,你必須在每個包括AssetTagHelper的類中包含你的幫手。時光飛逝,你或其他人可能忘記需要你的補丁包括在內。您只需包含AssetTagHelper並開始懷疑:爲什麼我的網站現在看起來不一樣?當你和補丁製作者是同一個人時,這很好。但是,如果不是? – jdoe