2015-08-18 38 views
1

我試圖與使用的名稱相同的多個值做一個POST請求,HTML類似:紅寶石機械化如何發送多個PARAMS同名

<input name="opt[]" value="1"/> 
<input name="opt[]" value="2"/> 
<input name="opt[]" value="3"/> 

隨着機械化我做這樣的事情:

params = {'opt[]' => [1,2,3]} 
agent.post 'url', params 

沒有運氣。

我試過其他選項,如opt: [1,2,3]也沒有運氣。

+0

您是否嘗試了'params = [[「opt []」,1],[「opt []」,2],[「opt []」,3]]''好像[文檔] //mechanize.rubyforge.org/Mechanize.html#method-i-post)和[This GitHub issue](https://github.com/sparklemotion/mechanize/issues/132)都表明這是一條路。 – engineersmnky

+0

是的,這工作。你介意把它寫成aswer嗎? –

回答

2

按照Documentation的機械化,在這種GitHub Issue討論適當的方式提交這些參數是通過使用二維數組如下

params = [["opt[]",1],["opt[]",2],["opt[]",3]] 
agent.post 'url', params 

在閱讀GitHub時,似乎這是一個已知的功能約束,他們正在或正在計劃努力解決這個問題,但目前這是正確的提交方法。如果您更喜歡使用Hash結構,那麼操作就不那麼困難了,例如

def process_to_mechanize_params(h) 
    h.map do |k,v| 
    if v.is_a?(Array) 
     v.map {|e| ["#{k}[]",e]} 
    else 
     [[k.to_s,v]] 
    end 
    end.flatten(1) 
end 

然後你可以使用

params = {'opt' => [1,2,3],'value' => 22, another_value: 'here'} 
process_to_mechanize_params(params) 
#=>=> [["opt[]", 1], ["opt[]", 2], ["opt[]", 3], ["value", 22], ["another_value", "here"]] 

希望這有助於。正如@pguardiario指出的那樣一個字符串也是可以接受的,但我覺得它可能會降低可讀性。

0

你應該能夠發佈他們作爲一個字符串:

agent.post url, 'opt[]=1&opt[]=2&opt[]=3'