Ruby Mechanize如何发送具有相同名称的多个参数

时间:2015-08-18 16:27:31

标签: ruby mechanize

我正在尝试使用多个相同名称的值来发布请求,html类似于:

<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]也没有运气。

2 个答案:

答案 0 :(得分:2)

根据Mechanize的Documentation和此GitHub Issue中的讨论,提交这些参数的正确方法是使用2D数组,如下所示

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所指出的,String也是可以接受的,但我觉得它可能会降低可读性。

答案 1 :(得分:0)

您应该能够将它们发布为字符串:

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