NoMethodError:未定义的方法`alias_method'

时间:2017-02-17 16:56:59

标签: ruby

我正在使用一些元编程(使用ruby 2.3.1),这样我就可以在调用我想调用的实际方法之前调用一个方法 - 比如before_filter / before_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: undefined method 'alias_method'

搜索周围没有帮助。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

做同样事情的简单方法:

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

interceptor(:puts, "oi")