Ruby 如何使用Rack::Test post发送多维数组
我使用Rack::Test-like提供的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”] 但我希望它保留多维数组的属性
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" }