2015-08-18 3 views
1

Я пытаюсь сделать пост запрос с использует несколько значений для того же имени, HTML похож на:рубин Mechanize как отправить несколько Params с таким же именем

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

С Mechanize я делаю что-то вроде :

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

Не повезло.

Я также пробовал другие варианты, например opt: [1,2,3].

+0

Вы пробовали 'params = [[" opt [] ", 1], [" opt [] ", 2], [" opt [] ", 3]]' Похоже, [Документы] (http: //mechanize.rubyforge.org/Mechanize.html#method-i-post) и [Этот вопрос GitHub] (https://github.com/sparklemotion/mechanize/issues/132) свидетельствуют о том, что это путь. – engineersmnky

+0

Да, это сработало. не могли бы вы написать его как асьер? –

ответ

2

Согласно Documentation для Mechanize и обсуждение в этом 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 также будет приемлемым, но я чувствую, что это может уменьшить читаемость.

0

Вы должны быть в состоянии размещать их в виде строки:

agent.post url, 'opt[]=1&opt[]=2&opt[]=3' 
Смежные вопросы