这个方法已经没有了,在看rails5.1+的源码里,但是还是记录一下这些方法演变的过程。
alias_method_chain产生的原因
因为给原方法增加新功能的想法在Rails中十分普遍。
传入 target(需要被包装的方法), feature(希望添加的特性名)。就会定义target_without_feature和target_with_feature的方法,且保持原方法相同的可见性。
回顾validations模块
在早期的ActiveRecord::Validations里: save和save!就被这样的方式包装上了validation的特性。
alias_method_chain方法的衰亡
像这样的方式,通常会污染你的类,可能会破坏以后的代码。更糟糕的是你难以追踪真正调用方法的是哪个版本。
通过重写加super的方式能更为干净的达到效果,虽然并没有很酷炫。
Module#prepend
通过prepend的方式,修改祖先链的顺序,在prepend的模块里可以复写super来修改增加功能。在需要处理一些想要修改却不太好修改的库时,这将会变得很方便,比如Rails中的一个类库。
网友评论