我有两种不同的哈希值:
hash1 = {"h1_k1": "h1_v1", "h1_k2": ["h1_v2"]}
hash2 = {"h2_k1": "h2_v1", "h2_k2": "h2_v2"}
每个散列的值都可能有很多次出现,但是即使每个散列都出现一次,也会出现以下问题:
我想在HTTP发布请求中将数据发送到Rails服务器,并且当我在单个请求中将整个数据发送给每个数据,在每个哈希中的一个请求中发送给行为时,行为有所不同。
在控制器中,params
将为以下内容:
一个请求:我将两个哈希值都推入array
和Net::HTTP.post_form(uri, array)
中。
Parameters: {"{\"h1_k1\"=>\"h1_v1\", \"h1_k2"\"=>"=>{"\"h1_v2"\""=>{"}"=>nil}, {\"h2_k1\"=>\"h2_v1\", {\"h2_k2\"=>\"h2_v2\"}"=>nil}
每个哈希请求一个:array.each {|hash| Net::HTTP.post_form(uri, hash) }
Parameters: {"h1_k1": "h1_v1", "h1_k2": "h1_v2"} # array converted to string of only the last element
Parameters: {"h2_k1": "h2_v1", "h2_k2": "h2_v2"}
这背后的原因是什么,有什么方法可以在单个请求中正确发送数据?
答案 0 :(得分:1)
在post_form(url, params)的定义中:
表单数据必须作为从 String 到 String
的哈希映射提供
在您的示例中,您有一个包含两个散列的 Array 。考虑将参数作为哈希传递。
答案 1 :(得分:1)
我最终以两种不同的方式解决它:
我在数组上使用了to_json
,并将标头Content-Type
设置为application/json
。
这允许即时访问格式正确的数组和服务器端params[:_json]
中的哈希。
例如params[:_json][0]['h1_k1']
给出h1_v1
。
我在阵列上使用了to_yaml
,并将标头Content-Type
设置为any of the YAML options。
后端的参数是空的,因为(我想)Rails无法自动解析它,但是使用request.raw_post
可以从发布主体获取数据。
因此,使用Psych.safe_load(request.raw_post)
会将其解析回哈希数组,从而可以像方法1中一样使用数据(不考虑params
)。