這個方法已經(jīng)沒有了,在看rails5.1+的源碼里雏掠,但是還是記錄一下這些方法演變的過程。
alias_method_chain產(chǎn)生的原因
因為給原方法增加新功能的想法在Rails中十分普遍酬蹋。
傳入 target(需要被包裝的方法), feature(希望添加的特性名)身笤。就會定義target_without_feature和target_with_feature的方法糖声,且保持原方法相同的可見性斤彼。
回顧validations模塊
在早期的ActiveRecord::Validations里: save和save!就被這樣的方式包裝上了validation的特性蘸泻。
alias_method_chain方法的衰亡
像這樣的方式琉苇,通常會污染你的類,可能會破壞以后的代碼悦施。更糟糕的是你難以追蹤真正調(diào)用方法的是哪個版本并扇。
通過重寫加super的方式能更為干凈的達到效果,雖然并沒有很酷炫抡诞。
Module#prepend
通過prepend的方式穷蛹,修改祖先鏈的順序,在prepend的模塊里可以復(fù)寫super來修改增加功能昼汗。在需要處理一些想要修改卻不太好修改的庫時肴熏,這將會變得很方便,比如Rails中的一個類庫顷窒。