2013-10-05 2 views
0

У меня есть этот 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 в строку

Что случилось с моим кодом?

ответ

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

+0

Это, безусловно, один из способов обойти проблемы, с которыми вы столкнулись, но я бы рекомендовал вам добавить 'else' для вашего' if 'который вызывает' super', так что 'method_missing' продолжает цепочку поиска метода, и соответствующие исключения возникают для методов, отличных от' class_breadcrumb'. – carols10cents

+0

правый, спасибо! –

Смежные вопросы