2013-09-25 77 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

好的,編輯來反映這一點 –

相關問題