2011-11-20 21 views
3

我想了解寶石是如何工作的,以及如何創建一個gem來覆蓋或向rails 3應用程序添加其他功能。這個gem如何鉤入你的錯誤處理?

這是一個錯誤捕獲gem,通過http發佈錯誤到服務器。

要安裝它,只需添加gem,然後使用您的api鍵創建一個初始化程序。

這部分我到目前爲止,但我需要幫助瞭解gem的執行情況以及它如何掛鉤到rails。

,我找到了相關的文件有:

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等到基類。

但是,這似乎與我前面發佈的代碼重複,當事件已被髮送到調用Airbrake::Rails.initializeApplicationController文件。

我希望有人能告訴我事情是如何執行的,它以什麼順序,因爲我只是不明白這個過程是如何工作的。

回答

4

重複的代碼在這裏支持不同版本的rails。

Rails的2.X

Rails的2.X查找rails/init.rb,以確定是否寶石是Rails插件或沒有。空氣制動一個包含一行:

require 'airbrake/rails' 

你下一步的總結得很正確:

這是在創業板將被實例化,然後某處 線運行減速板:: Rails.initialize方法何時完成 解析/lib/airbrake/rails.rb文件?

Rails的3.X

的Rails插件3.X往往Rails::Railtie繼承,才能夠定義Rake任務,插入啓動順序或do a lot of other interesting things

lib/airbrake.rb檢查Railtie類的可用性以下行(相當於檢查,如果你正在運行的軌道3),並定義Airbrake::Railtie,如果是這種情況:

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

當定義一個Railtie,你不不必手動運行(相當於Airbrake::Rails.initialize),子類Rails::Railtie就足以創建您的插件。

補充閱讀

如果你想了解Rails 3的實現其模塊化,下列文件將是非常有幫助的:

+0

謝謝,順便說一句,是否有可能創建一個gem並同時在rails web應用中測試它?還是你分別創建一個寶石?想學這個東西! – Blankman

+0

@Blankman使用'rails plugin new'在'test/dummy'(或者'spec/dummy')中創建一個插件框架,並在其中創建一個虛擬測試應用程序來完成集成/功能測試,但是沒有任何東西阻止您運行該應用程序。這就是我所做的,因爲我喜歡在gem存儲庫中有一個示例應用程序。 –

相關問題