Spec-Zone.ru › Ruby on Rails 4.1

модуль ActiveSupport::Rescuable::ClassMethods

Публичные методы экземпляров

rescue_from(*klasses, &block) Показать исходный код

Обрабатывать исключения, возникающие в действиях контроллера.

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

Исключения, возникающие внутри обработчиков исключений, не распространяются вверх.

# 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

© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API