2012-01-18 12 views
5

我希望能夠從我的config.ru機架初始化代碼中檢索我的網絡應用的基本URL。沿着線的東西:我可以在請求處理程序之外獲取我的Rack服務的基本URL嗎?

puts "Starting up on http://#{ENV['SERVER_NAME']}:#{ENV['SERVER_PORT']}/#{ENV['MOUNT_POINT']}..." 

,但我還沒有發現這樣的事情那是可以從請求處理程序之外。顯然,我可以這樣做:

... 
def get 
    puts "Got a request for #{ENV['rack.url_scheme']}://#{ENV['HTTP_HOST']}#{ENV['REQUEST_PATH']}" 
    ... 

因爲請求是在那個點定義的。但在我的配置文件開始時,這些變量都沒有被定義。

有沒有可用於訪問此信息的Rack方法?在Rack啓動完成之前,這些情況還沒有最終確定?我似乎記得其他框架有辦法將一個proc傳遞給一個將在環境「準備就緒」時執行它的方法。 Rack有類似的東西嗎?

+0

你想在需要此信息的config.ru中設置什麼? – nictrix 2012-03-11 05:33:23

+0

我不想*設置任何東西,我只是覺得日誌很好地顯示服務的位置 - 當新開發人員第一次嘗試測試時,它特別有用。 – Coderer 2012-05-17 08:30:44

回答

2

我不相信Rack應用程序可能會提前知道「掛載點」。例如,這config.ru安裝在多個相同的應用程序的安裝點:

require 'rack' 

app = proc { |env| 
    [200, {'Content-Type' => 'text/plain'}, ['hello, world!']] 
} 

run Rack::URLMap.new('/myapp' => app, 
        '/' => app) 

機架也沒有提供被稱爲在初始化時的任何標準方法。我懷疑這是因爲Rack試圖支持普通的CGI,在這裏可以創建一個完整的Ruby進程來處理每個請求,同時進程在每個請求中退出。在這種情況下,「init」方法沒有多大用處。

2

這是大約一年後,但我只是在同一個問題掙扎,發現你的線程。

每個機架應用程序都提供一個調用方法,可以被機架處理程序調用。例如,請參閱Sinatra :: Base#調用代碼。這個調用方法每個請求被調用一次,並且有一個參數是一個包含環境變量的哈希。在這些內部有你需要的一切,你要求的「mount_point」被稱爲「SCRIPT_NAME」。

有關詳細信息,請參閱http://www.rubydoc.info/github/rack/rack/file/SPEC。不幸的是,這些信息只能在請求期間提供給您,而據我所知,此信息不會在以前提供給您。希望它能幫助別人。

相關問題