2011-11-20 4 views
3

私は宝石の仕組みを理解しようとしています。また、宝石を作成して、レール3アプリケーションに機能を追加または追加する方法を理解しようとしています。この宝石はあなたのエラー処理にどのようにフックしますか?

これは、サーバーへのHTTP経由宝石そのポストのエラーをキャッチエラーです。あなたは、単に宝石を追加し、それはあなたのAPIキーと初期化子を作成し、それをインストールするには

この部分、私は、これまで取得が、私は宝石の実行と、それがどのようにレールにフックを理解する必要があります。私が見つけた

関連するファイルは以下のとおりです。

それは ActionControllerクラスにメソッドを追加

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

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アプリケーション起動すると、イニシャライザを通過します。

これは、/lib/airbrake/rails.rbファイルの解析が完了すると、宝石がインスタンス化され、次にどこかでAirbrake::Rails.initializeメソッドを実行する場所ですか?

私は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などを送信します。

これは、Airbrake::Rails.initializeへの呼び出しですでにApplicationControllerファイルに送信されていたコードを複製しているようです。

私は誰かが物事がどのように実行され、どのような順序でそれが明確な方法でこのプロセスがどのように機能するかわからないので、私に教えてくれることを望んでいます。

答えて

4

重複したコードは、さまざまなバージョンのレールをサポートするためのものです。

Railsの2.X

Railsの2.Xは宝石がレールプラグインされているかどうかを判断するためにrails/init.rbを探します。エアブレーキ1は、単一の行が含まれています。次のステップの

require 'airbrake/rails' 

あなたの要約は、スポットオンだった:宝石のラインがエアブレーキを実行し、どこかダウン その後、インスタンス化してしまいますどこ

はこれです:: Rails.initializeメソッドが終了したら /lib/airbrake/rails.rbファイルを解析しますか?

Railsの3.X

Railsの3.Xのプラグインは、多くの場合、ブートシーケンスやdo a lot of other interesting thingsに差し込み、すくいタスクを定義できるようにするには、Rails::Railtieから継承します。

lib/airbrake.rbチェックRailtieクラスの可用性に次の行、それはケースだ場合とAirbrake::Railtieを定義します(チェックと同等のあなたは、レール3を実行している場合):Railtieを定義

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

、あなたドン手動で実行する必要があります(Airbrake::Rails.initializeに相当)、サブクラス化するRails::Railtieはプラグインを作成するのに十分です。

追加の読み取り

あなたは3は、そのモジュールをどのように達成するかをレール理解したい場合は、以下のドキュメントは非常に参考になります。

+0

ありがとう、btw、それは同時に宝石を作成し、レールのWebアプリケーションでそれをテストすることは可能ですか?別に宝石を作りますか?このことを学びたい! – Blankman

+0

@Blankman 'rails plugin new 'を使用すると、テスト/ダミー(または' spec/dummy')にダミーテストアプリを含むプラグインスケルトンが作成され、統合/機能テストが実行されますが、これは、私が宝石リポジトリにサンプルアプリケーションを持っているのが好きなので、私がやっていることです。 –

関連する問題