在Rails库中覆盖实例方法

时间:2015-10-12 17:06:34

标签: ruby-on-rails inheritance actionmailer instance-method

这看起来像是一个猴子补丁。我该如何改进呢?

尝试从ActionMailer :: MessageDelivery类重写deliver_now实例方法。以下代码有效。

但是,有没有办法通过类继承或其他方式更优雅地说明这一点?结束代码用于自定义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但他们没有解决这个问题。

1 个答案:

答案 0 :(得分:3)

您可以查看Ruby的refinements

示例改进:

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

然后在你的课堂上:

module MyModule
  class Ses 
    using MyMessageRefinement
  end
end