модуль ActiveSupport::Rescuable::ClassMethods
Публичные методы экземпляров
# File activesupport/lib/active_support/rescuable.rb, line 51
def rescue_from(*klasses, &block)
options = klasses.extract_options!
unless options.has_key?(:with)
if block_given?
options[:with] = block
else
raise ArgumentError, "Need a handler. Supply an options hash that has a :with key as the last argument."
end
end
klasses.each do |klass|
key = if klass.is_a?(Class) && klass <= Exception
klass.name
elsif klass.is_a?(String)
klass
else
raise ArgumentError, "#{klass} is neither an Exception nor a String"
end
# put the new handler at the end because the list is read in reverse
self.rescue_handlers += [[key, options[:with]]]
end
end Обрабатывать исключения, поднятые в действиях контроллера.
rescue_from получает ряд классов исключений или имен классов, и :with опцию с именем метода или объектом Proc для обработки. Также может быть передан блок.
Обработчики, которые принимают один аргумент, будут вызываться с исключением, чтобы исключение можно было проверить при работе с ним.
Обработчики наследуются. Они ищутся справа налево, снизу вверх, и вверх по иерархии. Обработчик первого класса, для которого exception.is_a?(klass) верно, вызывается, если он есть.
class ApplicationController < ActionController::Base
rescue_from User::NotAuthorized, with: :deny_access # self defined exception
rescue_from ActiveRecord::RecordInvalid, with: :show_errors
rescue_from 'MyAppError::Base' do |exception|
render xml: exception, status: 500
end
protected
def deny_access
...
end
def show_errors(exception)
exception.record.new_record? ? ...
end
end Исключения, поднятые внутри обработчиков исключений, не передаются вверх.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.