我有 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
我的代码出了什么问题?
答案 0 :(得分: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