Ruby 如何使用Rack::Test post发送多维数组

Ruby 如何使用Rack::Test post发送多维数组,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我使用Rack::Test-like提供的post方法发送多维数组 post“#{url}.json”,:data=>[[“公司”,“网站”],[“这是虚拟文本,带逗号”,“www.technology.com”],[“某公司”,“www.url.com”] 但是在我的控制器中,当检查我的参数params[:data]时,我将其作为一维数组[“公司”、“网站”、“这是带逗号的伪文本”、“www.technology.com”、“某公司”、“www.url.com”] 但我希望它保留多维数组的属性

我使用Rack::Test-like提供的post方法发送多维数组

post“#{url}.json”,:data=>[[“公司”,“网站”],[“这是虚拟文本,带逗号”,“www.technology.com”],[“某公司”,“www.url.com”]

但是在我的控制器中,当检查我的参数
params[:data]
时,我将其作为一维数组
[“公司”、“网站”、“这是带逗号的伪文本”、“www.technology.com”、“某公司”、“www.url.com”]


但我希望它保留多维数组的属性。我需要帮助才能做到这一点。

Rack::Test方法都有相同的签名。。。第二个参数是参数的散列

i、 e

这是因为它们只是URL参数——这是典型的键/值结构(即散列) 为什么需要多维数组

编辑:哦,我明白了-你有一个带一个键的散列(:data)

如果它仍然给你带来悲伤,你可以直接打电话给那里的_param

ruby-1.9.2-p180 :003 > h = {:data => [["Company","Website"],["this is the dummy text, with,comma","www.technology.com"],["some company","www.url.com"]]}
 => {:data=>[["Company", "Website"], ["this is the dummy text, with,comma", "www.technology.com"], ["some company", "www.url.com"]]} 
ruby-1.9.2-p180 :004 > h.to_param
 => "data[][]=Company&data[][]=Website&data[][]=this+is+the+dummy+text%2C+with%2Ccomma&data[][]=www.technology.com&data[][]=some+company&data[][]=www.url.com" 

如果确实需要嵌套数组,一个解决方法是将请求内容类型更改为JSON:

post url, JSON.dump([[1, 2], [3, 4]]), { "CONTENT_TYPE" => "application/json" }

这将正确地将嵌套阵列发送到rack应用程序。

以上两种方法对我来说都不是很好,但确实如此(请参阅我的原始答案)

问题在于,默认情况下,body以
application/x-www-form-urlencoded
的形式发送,这不能很好地处理多维数组。您可以将其作为
application/json
发送,但Sinatra可能不会将数据合并到请求参数中。我使用的中间件来自
rack contrib
,它解析POST请求中的json正文,并为您合并它:

#文件
`宝石“机架控制”`
然后config.ru:

要求“机架/连接”
需要“./app”
使用Rack::PostBodyContentTypeParser
运行Sinatra::应用程序
默认情况下,这不会用于测试,但您可以指定:

#spec_helper.rb
OUTER_APP=Rack::Builder.parse_文件(“config.ru”)。首先
模块RSpecMixin
include Rack::Test::Methods
def应用程序
外部应用程序#通常这可能只是Sinatra::Application
结束
结束
RSpec.configure do | config|
config.include RSpecMixin
结束
用法和示例:

这“没问题”怎么办
发布“/”,{key:'value'}。到_json,{'CONTENT_TYPE'=>'application/json'}
期待(最后的回应)。一切正常
结束

感谢您的努力。尽管它是作为键值对发送的,如以下格式<代码>:data=>[[],[],[]]我希望值部分保留它的属性,因为多维数组有任何方法可以做到这一点吗??。我迫切需要它作为一个数组,以避免在我的控制器中使用另一种解析方法。可能值得抓取Rack::Test的源代码并添加进一步的测试-看起来在@brynary的规范中2d数组从未进行过测试。我得到的是
“data”=>[nil,nil,nil,nil,nil,nil]
现在在控制器中,当我使用h.to_参数传递它时
post url, JSON.dump([[1, 2], [3, 4]]), { "CONTENT_TYPE" => "application/json" }