我已经制作了一个自定义异常处理程序,它在很大程度上起了很大的作用。这是它的要点 -
应用程序/错误/ duck.rb
module Duck
def Duck::ReportError(u,c,m,p)
User.send_error_email(u,c,m,p)
User.msg(m)
end
end
应用程序/邮寄者/ notifications.rb
def err_report(current_user,err_script,err_msg,err_scrub)
@current_user = current_user
@err_script = err_script
@err_msg = err_msg
@err_scrub = err_scrub
mail(:to => sr_dev, :cc => jr_dev, :subject => "Error Found")
end
这就是我的问题所在 - 上面的代码是当前编写的。为了消除重复,有一些小的改变。我之前会按以下方式进行调用 - 任何错误都像这个例子一样处理,将其置于users_controller.rb中的所有操作中......
rescue Exception => msg
Duck.ReportError(current_user,"users_controller.rb",msg,"Dumping params: #{params.inspect}")
任何错误都必须导致鸭子调用 - 因此之前的重复...没有达到此目的。它也完全删除了DRY,所以我重新编写了duck.rb文件并发现通过将它放在应用程序控制器中,任何从ApplicationController继承的东西都可以像这样引发鸭子 -
rescue_from Exception, :with => :any_error
protected
def any_error(msg)
Duck.ReportError(current_user,"application_controller.rb",msg,"Dumping params: #{params.inspect}")
render "home/duck.erb"
end
其余的代码对于手头的问题是微不足道的,这是: 我需要向开发团队展示错误源自哪个文件。当我第一次制作Duck时,它是从每个动作/视图/控制器直接调用的,如前所示,这是很多重复,但有一个好处,我可以告诉它具体哪个脚本生成错误。现在我有点抽象了错误处理程序,这很好 - 但每次出现错误时,例如reports_controller.rb,它都会将错误报告为来自application_controller.rb。我怎样才能解决这个问题?如何获得错误的实际来源?
系统:
$ rails -v
Rails 3.0.20
$ ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [x86_64-linux]