相关疑难解决方法(0)

通过访问原始文件覆盖rails帮助程序

我想使用rails熟悉的助手,但功能略有改变.我看待它的方式,我希望能够做到这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

我看到它的方式,我有三个选择:

  1. 猴子修补:重新打开rails helper模块.如果rails团队改变了他们的帮助器模块的名称,我的代码就变成了脆弱的来源.不是不可克服的,但并不理想.
  2. 使用不同的方法名称:试图坚持共轨接口可能是我的垮台.我的更改可能会成为其他开发人员混淆的根源
  3. 分离方法(新):不确定这是否有效,或者它是否会有与1相同的缺点.研究这个,但这可能是一个很好的起点.

所以这里的问题是,我是否坚持使用其中一种次优解决方案,还是有其他方式我没有考虑过?如果我选择选项3,有没有办法在不直接寻址rails helper模块的情况下执行此操作?

(注意:我删除了上下文,因为它没有添加任何问题.)

ruby overriding ruby-on-rails helpers

22
推荐指数
3
解决办法
9466
查看次数

定义"method_called"..如何在每次调用类的任何函数时调用一个钩子方法?

我想创建一个钩子方法,每次调用类的任何函数时都会调用它.我已经尝试过method_added,但它只在类定义时执行一次,

class Base

  def self.method_added(name)
    p "#{name.to_s.capitalize} Method's been called!!"
  end
  def a
    p "a called."
  end
  def b
    p "b called."
  end
end
t1 = Base.new
t1.a
t1.b
t1.a
t1.b

Output:

"A Method's been called!!"
"B Method's been called!!"
"a called."
"b called."
"a called."
"b called."
Run Code Online (Sandbox Code Playgroud)

但我的要求是在程序中的任何地方调用的类的任何函数都会触发"method_called",钩子方法.

Expected Output:
"A Method's been called!!"
"a called."
"B Method's been called!!"
"b called."
"A Method's been called!!"
"a called."
"B Method's been called!!"
"b called."
Run Code Online (Sandbox Code Playgroud)

如果有任何已定义的现有钩子方法可以正常工作,那么请告诉它.

提前致谢..

ruby hook metaprogramming

12
推荐指数
2
解决办法
5766
查看次数