在多个方法中添加相同的代码

时间:2018-06-15 12:48:55

标签: ruby-on-rails ruby metaprogramming

我有一个有N种方法的类。

class MyClass
  def self.method_one(params)
    #specific code
  end

  def self.method_two(params)
    #specific code
  end
end

我需要为该类中创建的每个方法添加相同的代码。我需要将代码放在" 开始和救援"

之间

我尝试了以下内容,但我没有成功:

class MyClass < BaseClass
  add_rescue :method_one, :method_two, Exception do |message|
    raise message                                                     
  end

  def self.method_one(params)
    #specific code
  end

  def self.method_two(params)
    #specific code
  end
end

我创建了一个方法来改变方法

class BaseClass
  def self.add_rescue(*meths, exception, &handler)
    meths.each do |meth|
      old = instance_method(meth)
      define_method(meth) do |*args|
        begin
          old.bind(self).call(*args)
        rescue exception => e
          handler.call(e)
        end
      end
    end
  end
end

我总是收到错误消息: 未定义方法`method_one&#39; for Myclass:Class

1 个答案:

答案 0 :(得分:3)

MyClass#method_one是一个类方法,换句话说,是MyClass.singleton_class的实例方法。也就是说,我们可以Module#prepend MyClass.singleton_class所需的功能:

def self.add_rescue(*meths, exception, &handler)
  mod =
    Module.new do
      meths.each do |meth|
        define_method meth do |*args, &λ|
          begin
            super(*args, &λ)
          rescue exception => e
            handler.(e) 
          end
        end
      end
    end

  MyClass.singleton_class.prepend(mod)
end