2014-10-10 28 views
0

我是新來的紅寶石。下面的代碼輸出rubypage參數:Ruby不能放置連接的字符串和散列元素?

cgi = CGI.new 
puts cgi.params['rubypage'] 

但是,只要我改成這樣,它什麼也不輸出

cgi = CGI.new 
puts cgi.params['rubypage']+"a" 

爲什麼會出現+"a"原因的存在沒有輸出?如何將CGI params元素與字符串連接起來?

+0

我的問題是,你爲什麼要使用CGI?這是90多歲。而應該使用[Sinatra](http://www.sinatrarb.com)之類的東西,如果你只依賴CGI,它將處理你必須做的很多任務。Sinatra通過Unicorn或Passenger很好地與Apache或nginx集成。 – 2014-10-10 22:12:49

+0

好吧,我會再試試Sinatra ..我安裝它時遇到了很多問題。我讀過一些其他的抱怨,說CGI是90年代,那麼這也意味着cgi存在很多安全風險? – John 2014-10-10 22:21:05

+0

不一定存在安全風險,您只需要開展一項必要工作,而不是必要的工作,這已經被Sinatra等工具所覆蓋。再加上Haml,你有一個很好的原型和內部開發系統。使用Passenger或Unicorn在nginx或Apache下運行,並獲得一些工業實力。當你想要一個更像Rails的環境時,看看Patron。當你需要它的全部力量時移動到Rails。 – 2014-10-11 22:10:57

回答

1

如果你檢查它的文檔,你會發現,CGI.params返回與參數名稱的Hash作爲它的鍵和參數值名單作爲它的值。這容納了可以多次指定相同查詢參數的事實。

如果你想選擇一個給定參數的值只有一個,那麼你可以索引到CGI對象本身,你應該能夠添加一個字符串結果:

puts "#{cgi['rubypage']}a" 

如果您想爲參數的所有值的數組,每個相同的字符串追加,那麼你可以做這樣的:

rubypageA = cgi.params['rubypage'].map do |value| 
    "#{value}a" 
end 
0

你在做什麼應該工作,取決於什麼是在該參數散列。

嘗試一個簡單的測試與IRB:

$ irb 
2.1.2 :001 > "string"+"another" 
=> "stringanother" 
2.1.2 :002 > 

Ruby's string interpolation可能是你的興趣,如果你打算做了很多本。

嘗試這種情況:

puts "#{cgi.params['rubypage']}a" 
0

cgi.params['rubypage']是一個數組。您不能將一個字符串連接到一個數組。 「TypeError:無法將字符串轉換爲數組」的錯誤必須記錄在某處。

0

以下添加到您的CGI腳本:

require 'cgi' 

$stdout.sync = true #Do not buffer output to STDOUT 
$stderr.reopen($stdout) #Send errors to stdout(which goes to your browser) 

那麼錯誤信息將被髮送到你的瀏覽器,如:

/usr/local/apache2/cgi-bin/myprog.rb:17:in `': no implicit conversion 
of String into Array (TypeError) 

這是相同的錯誤,如果你嘗試,你會得到請執行以下操作在常規的Ruby程序:

[1, 2, 3] + 'a' 

I read a few other complaints that cgi is 90s, so does that imply also that there are a lot of security risks with cgi?

還有秒對任何網站都有風險。 CGI是非常輕量級的,所以如果你想做簡單的事情(或定製的東西),它是好的。這是一個很好的介紹web編程。