2009-12-14 49 views
2

在Rails的初始化程序/ environment.rb中如果Web應用程序本身正在加載(腳本/服務器),那麼什麼是干預方式。確定腳本/服務器是否正在啓動

所有初始化程序都被加載用於migrations腳本/控制檯和其他rails任務,但在我的情況下,只有在服務器本身初始化時才需要加載一些東西。

我的想法:檢查$ 0

謝謝! Reto

回答

3

因爲有多個應用程序服務器,每個應用程序服務器都有自己的初始化策略,所以我會推薦可靠地掛接到服務器啓動過程的唯一方法:ActionController :: Dispatcher

調度程序有一些回調;即:

  • prepare_dispatch(添加有to_prepare
  • before_dispatch
  • after_dispatch

「準備」 回調在開發模式中每一個請求之前運行,並在生產模式中的第一請求之前。 Rails的配置對象允許您通過自己的to_prepare方法添加這樣的回調:

Rails::Initializer.run do |config| 
    config.to_prepare do 
    # do your special initialization stuff 
    end 
end 

不幸的是,據我所知,這個回調將始終運行,因爲Rails的初始化調用Dispatcher.run_prepare_callbacks不管我們與服務器開機的或腳本/控制檯甚至是耙子任務。要避免這種情況,所以你可以試試這個在您的environment.rb:

Rails::Initializer.run do |config| 
    # your normal stuff 
end 

if defined? ActionController::Dispatcher 
    ActionController::Dispatcher.to_prepare do 
    # your special stuff 
    end 
end 

現在,你的「特別的東西」只在生產模式下第一請求之前執行,但之前在每一個發展請求。如果您正在加載額外的庫,則可能需要通過在loadrequire之間放置if聲明來避免加載兩次。 require方法不會加載一個文件兩次,但我仍然建議您在其周圍放置一個警戒。

+0

謝謝!檢查調度程序聽起來像是一個非常好的主意!但我不會掛鉤到'to_prepare',因爲我只需要做一些事情(啓動時)。但是這個概念仍然是一樣的!很棒:D。 – reto 2009-12-14 16:25:39

+0

啊我看到了,不,ActionController :: Dispatcher是在任何情況下定義的。這可能是由於我使用jruby引起的。不知道。我想我現在會回到0美元。不管怎麼說,還是要謝謝你! – reto 2009-12-14 17:31:18

+0

沒關係!它完美的工作,愚蠢的我放置了一個「放」調度加載「'在錯誤的位置;)。謝謝 – reto 2009-12-14 17:38:35

0

有可能是一個更好的方法來做到這一點,但由於我不知道一個,我可能會改變腳本/服務器來設置某種環境變量。

然後我會有我的初始化程序檢查該環境變量。