如何通过POST发送多个相同的键/参数?

时间:2013-09-25 12:03:37

标签: ruby-on-rails ruby net-http

如果我必须在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)

我无法控制接收端,因此我必须按预期接收它们发送参数。怎么样?

2 个答案:

答案 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