5

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

我无法控制接收端,因此我必须按照预期接收参数发送参数。如何?

4

2 回答 2

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

并发布为:

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接受具有数组作为值的参数,但不要触摸键符号。因此,如果您将"color"密钥更改为通常的参数约定,您将使用"color[]".

这正是您不想在您的情况下做的事情。保留密钥"color"将达到预期的结果。

于 2013-09-25T12:11:40.303 回答
6

你能不能简单地:

<input name="color[]" value="red"/>
<input name="color[]" value="green"/>
<input name="color[]" value="blue"/>

对于其他的想法,你也可以看到这个类似的帖子

于 2013-09-25T12:05:06.477 回答