我想使用导轨熟悉的助手,但功能稍有变化。我看到它的方式,我希望能够做一些事情,如:覆盖导轨助手访问原始
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