2013-09-25 76 views
4

如果我不得不通过HTTP请求发送大量帖子参数,所有这些参数都具有相同的名称,我该如何构建要发布的对象data如何通过POST发送多个相同的密钥/参数?

图片与一些复选框形式,它们都具有相同的属性name但具有不同的值(如果他们选中):

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

我想构建这样的红宝石(但它需要创建动态根据什么选择的形式):

data = { 
    "color" => "red", 
    "color" => "green", 
    "color" => "blue" 
} 

,然后将数据发送到某些网址:

Net::HTTP.post_form(url, data) 

我无法控制接收端,所以我必须发送参数,因为它期望接收它们。怎么样?

回答

5

你能不能简单:

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

对于其他的想法,你也可以看到这个similar post

+0

接收端没有使用导轨。 –

+0

好的,那么它看起来像你需要使用上面的链接中的方法。您可能需要更新问题以指定您无法控制接收方 –

6
data = { 
    "color" => "red", 
    "color" => "green", 
    "color" => "blue" 
} 

你不能有,因为这将导致具有单个键红宝石:

> { 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"/> 

This将转化为一个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"将取得预期的结果。

+0

正确,但这是张贴到另一个表格(不在我的网站上)。所以我需要传递多个“颜色”参数,但具有不同的值。我可能必须构建参数字符串才能发送,而不是尝试发送对象。 –

+0

好的,编辑来反映这一点 –

相关问题