覆盖 Rails 库中的实例方法

Overriding Instance Method in Rails Library

这似乎是一个猴子补丁。我该如何改进它?

正在尝试覆盖 ActionMailer::MessageDelivery class 中的 deliver_now 实例方法。下面的代码有效。

但是,有没有一种方法可以通过 class 继承或其他方式更优雅地实现这一点?结束代码用于自定义 ActionMailer 邮件程序。

module MyModule
  class Ses 

    ActionMailer::MessageDelivery.class_eval do
      def deliver_now!
        puts self.to
        puts self.subject
      end
    end
    ...
  end
end

注意:我看过这些类似的问题one & two,但它们没有解决这个问题。

您可能会查看 Ruby 的 refinements

细化示例:

module MyMessageRefinement
  refine(ActionMailer::MessageDelivery) do
    def deliver_now!
      puts self.to
      puts self.subject
    end
  end    
end

然后在你的 class:

module MyModule
  class Ses 
    using MyMessageRefinement
  end
end