2014-10-10 27 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编程。