Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 发送带有延迟作业的电子邮件时出错报告_Ruby On Rails 3_Delayed Job_Error Reporting_Airbrake_Exception Notifier - Fatal编程技术网

Ruby on rails 3 发送带有延迟作业的电子邮件时出错报告

Ruby on rails 3 发送带有延迟作业的电子邮件时出错报告,ruby-on-rails-3,delayed-job,error-reporting,airbrake,exception-notifier,Ruby On Rails 3,Delayed Job,Error Reporting,Airbrake,Exception Notifier,当使用AirBrake或ExceptionNotifier之类的工具邮寄延迟的作业时,获取错误报告的正确方法是什么 我试图创建自己的延迟作业类,但是由Mailer.welcome()(或类似)创建的邮件对象没有正确序列化。我还尝试向PerformableMailer和PerformableMethod类添加error(job,exception)方法,但我发现了更多与序列化相关的错误。我尝试了psych和sych进行序列化。首先,在mailer中包含一个模块,可能还有其他延迟作业: module

当使用AirBrake或ExceptionNotifier之类的工具邮寄延迟的作业时,获取错误报告的正确方法是什么


我试图创建自己的延迟作业类,但是由
Mailer.welcome()
(或类似)创建的邮件对象没有正确序列化。我还尝试向
PerformableMailer
PerformableMethod
类添加
error(job,exception)
方法,但我发现了更多与序列化相关的错误。我尝试了psych和sych进行序列化。

首先,在mailer中包含一个模块,可能还有其他延迟作业:

module Delayed
  module Airbrake
    # Send error via Airbrake
    def error(job, e)
      ::Airbrake.notify(e, :component => job.name, :action => 'perform', :parameters => {:job => job.inspect})
    end
 end
结束

然后包括:

Delayed::PerformableMailer.send(:include, Delayed::Airbrake)
更新的解决方案 总的来说,解决方案相当简单。如果您正在对对象执行延迟的任务(如
MyClass.new.delay.some\u方法
),则需要将错误处理定义为对象方法。如果您正在类上执行延迟任务(如
MyTestMailer.test\u email…
),则需要将错误处理定义为类方法

假设您有一个名为
TestMailer
的邮件程序。解决方案是将错误处理定义为类方法,而不是对象方法:

现在,上面的
def self.error
方法将用作延迟作业中的错误回调

或者,如果您希望能够处理所有操作邮件程序错误

class ActionMailer::Base
  def self.error(job, e)
    puts "I can now handle all mailer errors in delayed job!!!"
  end
end
原因在于DelayedJob的内部
PerformableMethod
处理错误的方式。
PerformableMethod
有两件事:目标对象和目标方法。在Action Mailer的例子中,目标对象不是对象,而是您的Mailer类
TestMailer
。目标方法是您使用的邮件方法,例如
test\u-mail
。DelayedJob查找目标对象上的所有挂钩(
错误
之前
之后,等等)。但在我们的例子中,目标对象是类本身。因此,钩子必须定义为类方法

DelayedJob
处理ActionMailer邮件的方式有点老套。如果添加对象方法而不是类方法,则会引发不需要的异常。例如,下面是代码:

# In <delayed-job-gem>/lib/delayed/performable_method.rb
module Delayed
  class PerformableMethod

    # line #7
    delegate :method, :to => :object
#In/lib/delayed/performable_method.rb
模块延迟
类执行方法
#第7行
委托:方法,:to=>:对象
ruby中的每个对象都有一个
方法
函数,用于获取该类中方法的原始引用。但是在DelayedJob中,这个原始的
方法
函数被委托给了其他一些目标对象。这种黑客行为使我们无法正常使用
def error
功能来处理作业错误

编辑:添加脚注,次要澄清


编辑2:重新排序的答案

当我试着这样做时,我得到了这样一个错误:类的未定义方法
error'…/gems/delayed\u job-3.0.5/lib/delayed/performable\u方法。rb:7:“方法”中你试过类似的方法吗?已发布更新的解决方案,请检查?它最终变成了一个简单的类方法,而不是一个对象方法!非常感谢你!回答得很好。如果要跟踪所有作业上的错误,请参阅:
# In <delayed-job-gem>/lib/delayed/performable_method.rb
module Delayed
  class PerformableMethod

    # line #7
    delegate :method, :to => :object