0

我有这个ApplicationController

class ApplicationController < ActionController::Base
  before_filter :class_breadcrumb
end

我要求每个控制器定义自己的 class_breadcrumb() 方法。如果该方法不存在,我想显示一条消息,而不引发异常。最后,我希望所有其他异常都回退到标准 xml 500 页面。

我觉得使用这个 rescue_from 块处理起来非常简单:

rescue_from "NameError" do |e|
  if e.to_s.include?('class_breadcrumb')
    flash.now["alert-danger"] = "You didn't provide a breadcrumb for #{request.fullpath}! Please send us a feedback including this message!"
    render params[:action]
  else
    # default behavior
    render :xml => e, :status => 500
  end
end

它有效!但是当从控制器内部引发任何其他异常时......假设我正在调用一个像这样的未定义方法:

<%= undefined_method_that_raise_an_exception %>

我看到一个带有此消息的空白页:

内部服务器错误

没有将 NameError 隐式转换为 String

我的代码有什么问题?

4

1 回答 1

0

最后,我想通了!

# rescue NoMethodError
def method_missing(method, *args, &block)
  if method == 'class_breadcrumb'
    flash.now["alert-danger"] = "You didn't provide a breadcrumb for #{request.fullpath}! Please send us a feedback including this message!"
    render params[:action]
  end
end

这是元编程 Ruby!这就是为什么我刚刚说服自己购买这本书并摆脱痛苦: http: //pragprog.com/book/ppmetr/metaprogramming-ruby

于 2013-10-05T22:00:47.597 回答