如果我必须在HTTP请求中发送一堆post参数,所有这些参数都具有相同的名称,我该如何构建要发布的data
对象?
图片包含一些复选框的表单,它们都具有相同的name
属性,但具有不同的值(如果他们已经检查过):
<input name="color" value="red"/>
<input name="color" value="green"/>
<input name="color" value="blue"/>
我想在ruby中构造它(但它需要根据表单上选择的内容动态创建):
data = {
"color" => "red",
"color" => "green",
"color" => "blue"
}
然后将数据发送到某个URL:
Net::HTTP.post_form(url, data)
我无法控制接收端,因此我必须按预期接收它们发送参数。怎么样?
答案 0 :(得分:7)
data = {
"color" => "red",
"color" => "green",
"color" => "blue"
}
你不能拥有它,因为这会导致Ruby只有一个密钥:
> { a: 1, a: 2, a: 3 }
=> {:a=>3}
但你可以这样:
data = {
colors: [ 'red', 'green', 'blue' ]
}
要实现这一点,请使用此HTML表示法:
<input name="color[]" value="red"/>
<input name="color[]" value="green"/>
<input name="color[]" value="blue"/>
这将转换为GET请求:
?color[]=red&color[]=green&color[]=blue
以POST作为:
color[]: red
color[]: green
color[]: blue
两者都将在服务器端提供:
params[ :color ] == [ 'red', 'green', 'blue' ]
如果 以这种方式提供参数,则可以利用Net::HTTP.post_form
的数组符号。在您的HTML中:
<input name="color[]" value="red"/>
<input name="color[]" value="green"/>
<input name="color[]" value="blue"/>
然后,在你的控制器中:
colors = params.delete( :color )
Net::HTTP.post_form( uri, { 'color' => colors }.merge( params ) )
Net::HTTP.post_form
接受以数组为值的params,但不要触及关键符号。因此,如果您要将"color"
键更改为常规参数约定,则可以使用"color[]"
。
这正是你不想要做的事情。将密钥保留为"color"
将获得所需的结果。
答案 1 :(得分:6)
你能不能简单地说:
<input name="color[]" value="red"/>
<input name="color[]" value="green"/>
<input name="color[]" value="blue"/>
对于其他想法,您还可以看到此similar post。