2014-10-16 123 views
0

我是新來的紅寶石。我在Ubuntu上安裝了apache的phusion-passenger。對於php的$ _SERVER ['REQUEST_URI']或任何php的$ _SERVER變量,是否有Ruby等價物?

我不使用Sinatra或鋼軌,因爲我只是想學習如何使用紅寶石第一。

+0

如果你只是想學習Ruby,那麼你甚至不需要使用Passenger或Apache,你只需要Ruby。你所追求的變量是標準的,並且通過環境表從Apache傳遞,因此,Ruby可以通過查看'ENV'來看到它們,但是你應該依賴框架來檢索這些變量並將它們傳遞給你。 – 2014-10-16 22:18:29

回答

2

當你有這樣一個簡單的機架式服務器:

require 'rack' 
require 'rack/server' 

class EnvInspector 
    def self.call(env) 
    [200, {}, [env.inspect]] 
    end 
end 

run EnvInspector 

它會回報你這樣的事情,告訴你在env變量的所有鍵:

{ 
    "SERVER_SOFTWARE"=>"thin 1.4.1 codename Chromeo", 
    "SERVER_NAME"=>"localhost", 
    "rack.input"=>#<StringIO:0x007fa1bce039f8>, 
    "rack.version"=>[1, 0], 
    "rack.errors"=>#<IO:<STDERR>>, 
    "rack.multithread"=>false, 
    "rack.multiprocess"=>false, 
    "rack.run_once"=>false, 
    "REQUEST_METHOD"=>"GET", 
    "REQUEST_PATH"=>"/favicon.ico", 
    "PATH_INFO"=>"/favicon.ico", 
    "REQUEST_URI"=>"/favicon.ico", 
    "HTTP_VERSION"=>"HTTP/1.1", 
    "HTTP_HOST"=>"localhost:8080", 
    "HTTP_CONNECTION"=>"keep-alive", 
    "HTTP_ACCEPT"=>"*/*", 
    "HTTP_USER_AGENT"=> 
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11", 
    "HTTP_ACCEPT_ENCODING"=>"gzip,deflate,sdch", 
    "HTTP_ACCEPT_LANGUAGE"=>"en-US,en;q=0.8", 
    "HTTP_ACCEPT_CHARSET"=>"ISO-8859-1,utf-8;q=0.7,*;q=0.3", 
    "HTTP_COOKIE"=> "_gauges_unique_year=1; _gauges_unique_month=1", 
    "GATEWAY_INTERFACE"=>"CGI/1.2", 
    "SERVER_PORT"=>"8080", 
    "QUERY_STRING"=>"", 
    "SERVER_PROTOCOL"=>"HTTP/1.1", 
    "rack.url_scheme"=>"http", 
    "SCRIPT_NAME"=>"", 
    "REMOTE_ADDR"=>"127.0.0.1", 
    "async.callback"=>#<Method: Thin::Connection#post_process>, 
    "async.close"=>#<EventMachine::DefaultDeferrable:0x007fa1bce35b88 
} 

所以env['REQUEST_URI']將等價於PHP中的$_SERVER['REQUEST_URI']

http://hawkins.io/2012/07/rack_from_the_beginning/更多的例子來說明如何使用架。

+0

@John:我更新了我的代碼。請將'[200,{},env.inspect]'改爲'[200,{},[env.inspect]]'。 – spickermann 2014-10-16 21:14:33

+0

我再次更新了我的答案(config.ru的最後一行)。似乎自從博客文章寫入以來,Rack API發生了顯着變化。我很抱歉,但我目前無法測試當前機器上的代碼。 – spickermann 2014-10-16 21:26:44

+0

好吧!有效。它還爲我提供了每個頁面加載時的新查詢字符串值,這可以解答我的另一個問題。感謝您幫助newb! – John 2014-10-16 21:31:48

1

我不使用Sinatra或鋼軌,因爲我只是想學習如何使用紅寶石第一。

Ruby不假定Web服務器。它是一種通用編程語言,可以獨立運行。如果您使用的是Web開發框架,它將爲您提供對這些數據的訪問。

Rails和Sinatra都使用Rack,它使用request object來訪問這些數據。 REQUEST_URI變量對應於包含查詢字符串的路徑;該fullpath方法用於訪問它:

# get '/articles' 
request.fullpath # => '/articles' 

# get '/articles?page=2' 
request.fullpath # => '/articles?page=2' 

基本API是在所有這些框架相同。供參考:

+0

謝謝。我一直在努力區分乘客,apache,ruby,Sinatra的角色和職責,所以我一直在失去時間......所以當出現問題時,我經常在我的故障排除中走錯了路。這就是爲什麼我認爲我應該堅持要領,在學習下一個東西之前先熟悉它。 – John 2014-10-16 21:10:34

+0

現在只需與Ruby和Sinatra一起工作,並忘記了Apache和Passenger中的接線。一旦你瞭解了Ruby,Rack和Sinatra,Padrino或Rails如何工作,其餘部分將更容易理解。 – 2014-10-16 22:20:40