Ruby 红宝石罐';t放置连接的字符串和散列元素?

Ruby 红宝石罐';t放置连接的字符串和散列元素?,ruby,hash,Ruby,Hash,我对ruby不熟悉。以下代码输出rubypage参数: cgi = CGI.new puts cgi.params['rubypage'] 但是,只要我把它改成这个,它就不会输出任何东西 cgi = CGI.new puts cgi.params['rubypage']+"a" 为什么+“a”的存在不会导致输出?如何用字符串连接CGIparams元素?根据params散列中的内容,您所做的应该是有效的 尝试使用irb进行简单测试: $ irb 2.1.2 :001 > "string"

我对ruby不熟悉。以下代码输出
rubypage
参数:

cgi = CGI.new
puts cgi.params['rubypage']
但是,只要我把它改成这个,它就不会输出任何东西

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

为什么
+“a”
的存在不会导致输出?如何用字符串连接CGI
params
元素?

根据params散列中的内容,您所做的应该是有效的

尝试使用irb进行简单测试:

$ irb
2.1.2 :001 > "string"+"another"
 => "stringanother" 
2.1.2 :002 > 
如果你打算做很多这件事,你可能会感兴趣

试试这个:

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

cgi.params['rubypage']
是一个数组。不能将字符串连接到数组。“TypeError:无法将字符串转换为数组”错误必须记录在某个位置。

如果您检查它的文档,您会发现
CGI.params
返回一个
散列,其中参数名称作为键,参数值列表作为值。这适应了同一查询参数可以多次指定的事实

如果只想为给定参数选择一个值,则可以索引到CGI对象本身,并且应该能够向结果追加字符串:

puts cgi['rubypage'] + "a"

如果希望为参数创建一个包含所有值的数组,每个值都附加了相同的字符串,则可以这样做:

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

将以下内容添加到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'
我还读过一些关于cgi是90年代的投诉,这是否也意味着 cgi有很多安全风险


任何网站都存在安全风险。CGI是非常轻量级的,所以如果你想做简单的事情(或定制的事情),它是很好的。这是对网络编程的一个很好的介绍。

我的问题是,为什么要使用CGI?现在是90年代。相反,使用类似的方法,如果您只依赖CGI,它将处理更多的任务。Sinatra通过Unicorn或Passenger与Apache或nginx很好地集成。哦,好的,我会再次尝试Sinatra。我在安装它时遇到很多问题。我读到了一些关于cgi是90年代的投诉,那么这是否也意味着cgi存在很多安全风险?不一定是安全风险,你只是走上了一条必须做很多不必要的工作的道路,这已经被Sinatra等工具所涵盖。再加上Haml,你就有了一个很棒的原型和内部开发系统。使用Passenger或Unicorn在nginx或Apache下运行,您将获得一些工业实力。当您想要一个更像Rails的环境时,请查看用户。当你需要它的全部能量时,移动到Rails。
[1, 2, 3] + 'a'