У меня есть этот ApplicationController:Поймайте NameError и NoMethodError с rescue_from в Rails 3
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 в строку
Что случилось с моим кодом?
Это, безусловно, один из способов обойти проблемы, с которыми вы столкнулись, но я бы рекомендовал вам добавить 'else' для вашего' if 'который вызывает' super', так что 'method_missing' продолжает цепочку поиска метода, и соответствующие исключения возникают для методов, отличных от' class_breadcrumb'. – carols10cents
правый, спасибо! –