Как этот камень попадает в вашу обработку ошибок? - PullRequest
3 голосов
/ 20 ноября 2011

Я пытаюсь понять, как работают гемы и как вы можете создать гем для переопределения или добавления дополнительных функций в приложение rails 3.

Это ловушка для ошибок, которая отправляет сообщения об ошибках через http на сервер.

Чтобы установить его, вы просто добавляете гем, а затем он создает инициализатор с вашим ключом API.

Эта часть дошла до меня, но мне нужна помощь, чтобы понять, как работает самоцвет и как он зацепляется за рельсы.

Соответствующий файл, который я нашел:

https://github.com/airbrake/airbrake/blob/master/lib/airbrake/rails.rb

Где он добавляет методы к классу ActionController:

  if defined?(ActionController::Base)
    ActionController::Base.send(:include, Airbrake::Rails::ActionControllerCatcher)
    ActionController::Base.send(:include, Airbrake::Rails::ErrorLookup)
    ActionController::Base.send(:include, Airbrake::Rails::ControllerMethods)
    ActionController::Base.send(:include, Airbrake::Rails::JavascriptNotifier)
  end

И внизу файла он выполняет его:

Airbrake::Rails.initialize


1. You add the gem to your GEMFILE, and call bundle.
2. You run the generator which creates the initializer file:

Итак, когда мое приложение rails запускается, оно проходит через инициализатор.

Это где экземпляр будет создан, а затем где-нибудь в конце строки запустит метод Airbrake::Rails.initialize, когда он завершит анализ файла /lib/airbrake/rails.rb?

Я вижу код инициализатора в файле railtie.rb:

https://github.com/airbrake/airbrake/blob/master/lib/airbrake/railtie.rb

config.after_initialize do
  Airbrake.configure(true) do |config|
    config.logger           ||= ::Rails.logger
    config.environment_name ||= ::Rails.env
    config.project_root     ||= ::Rails.root
    config.framework        = "Rails: #{::Rails::VERSION::STRING}"
  end

  if defined?(::ActionController::Base)
    require 'airbrake/rails/javascript_notifier'
    require 'airbrake/rails/controller_methods'

    ::ActionController::Base.send(:include, Airbrake::Rails::ControllerMethods)
    ::ActionController::Base.send(:include, Airbrake::Rails::JavascriptNotifier)
  end
end

Это, кажется, имеет смысл сейчас, так как он запускает этот код после запуска инициализатора и устанавливает конфигурацию, он отправляет ControllerMethods и т. Д. В базовый класс.

Но, похоже, это дублирует код, который я выложил ранее, когда вещи уже отправлялись в файл ApplicationController при вызове Airbrake::Rails.initialize.

Я надеюсь, что кто-то может сказать мне, как все происходит, и в каком порядке, поскольку я просто не понимаю, как этот процесс работает четко.

1 Ответ

4 голосов
/ 20 ноября 2011

Дублированный код здесь для поддержки различных версий рельсов.

Рельсы 2.X

Rails 2.X ищет rails/init.rb, чтобы определить, является ли самоцвет плагином для рельсов или нет. Аэробайк содержит одну строчку:

require 'airbrake/rails'

Ваше резюме следующего шага было точным:

Это где драгоценный камень будет создан, а затем где-то вниз после запуска строка запускает метод Airbrake :: Rails.initialize парсинг файла /lib/airbrake/rails.rb?

Рельсы 3.X

Плагины Rails 3.X часто наследуются от Rails::Railtie, чтобы иметь возможность определять задачи rake, подключаться к последовательности загрузки или делать много других интересных вещей .

Следующая строка в lib/airbrake.rb проверяет доступность класса Railtie (эквивалентно проверке, если вы используете rails 3) и определяет Airbrake::Railtie, если это так:

require 'airbrake/railtie' if defined?(Rails::Railtie)

При определении Railtie вам не нужно запускать его вручную (эквивалент Airbrake::Rails.initialize), для создания плагина достаточно подкласса Rails::Railtie.

Дополнительное чтение

Если вы хотите понять, как rails 3 достигает своей модульности, вам будет полезна следующая документация:

...