Ruby NoMethodError:未定义方法`alias\u方法&\x27;

Ruby NoMethodError:未定义方法`alias\u方法&\x27;,ruby,Ruby,我正在使用一些元编程(使用ruby 2.3.1),这样我就可以在调用我想要调用的实际方法之前调用一个方法,比如before\u filter/before\u action 下面的伪代码解释了我试图实现的目标 module Api def call_this_method_everytime if A go ahead and call the actual method being called else stop here do not call

我正在使用一些元编程(使用ruby 2.3.1),这样我就可以在调用我想要调用的实际方法之前调用一个方法,比如before\u filter/before\u action

下面的伪代码解释了我试图实现的目标

module Api
  def call_this_method_everytime
    if A
      go ahead and call the actual method being called
    else
      stop here do not call he method it was supposed to call
    end
  end

  def when_i_call_this_method

  end

  def or_this_method

  end
end
在SO成员的帮助下,我从理论上理解了我想用元编程做什么——我得到了下面的代码

 module Api
    def heartbeat
      ...
    end

    def interceptor(name)
      original_method = "original #{name}"
      alias_method original_method, name
      define_method(name) do |*args|
        heartbeat
        result = send original_method, *args
        puts "The method #{name} called!"
        result
      end
    end

end
我没有调用我想要的方法,而是使用我想要调用的实际函数的名称作为参数来调用拦截器方法。然后,我将首先调用
heartbeat
函数,如果检查正常,则继续实际调用实际函数

然而,由于元编程的知识有限,我得到了这个错误

NoMethodError:未定义的方法“别名\u方法”


四处搜寻也无济于事。感谢您的帮助。

做同样事情的简单方法:

def interceptor(name, *args)
  if 1 == 1
    send name, args
  end
end

interceptor(:puts, "oi")

alias_方法是一种主动支持方法,这可能就是您在此处未定义的原因。让我看看我是否理解正确-当调用
拦截器(my_方法)
时,是否要修改my_方法,使其在继续其原始功能之前先调用heartbeat?在你的代码中,你正在使用alias_方法创建一种原始方法的“副本”,一旦你调用了heartbeat,你就可以在修改后的方法中调用它。我以前误解了这个问题,下面是一个更接近你要做的事的更新版本。@Pedronascemento
alias_方法
是。@Jordan哇哦,你说得对<代码>别名\u方法\u链是来自主动支持的代码。:)我认为petros希望拦截器被调用一次,从而导致该方法的未来调用被拦截。这需要每次调用拦截器。@eiko实际上我每次都要校准它,因为我要先检查发送请求的服务器是否为“live”,然后再发送请求。Pedro感谢您提供了简单明了的解决方案!(我们在diff language heh中有相同的名称btw)但是,我如何使*args参数可选,因为并非所有函数都需要参数?只需设置一个空数组:*args=[]@Pedronascemento hmm似乎不喜欢它
语法错误,意外的“=”,期望的“')def侦听器(名称,*args=[])