2013-09-25 3 views
4

Если мне пришлось отправить кучу параметров сообщения по HTTP-запросу, все с тем же именем, как мне создать объект data для публикации?Как отправить несколько одинаковых ключей/параметров через POST?

Picture форма с некоторыми флажками, все они имеют один и тот же name атрибута, но с разными значениями (если они проверяются):

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

Я хочу, чтобы построить это рубин (но это нужно создаваться динамически в зависимости от того, что был выбран на форме):

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

А затем отправить данные в какой-то URL:

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

Это переведут на запрос GET, как:

?color[]=red&color[]=green&color[]=blue 

И POST, как:

color[]: red 
color[]: green 
color[]: blue 

И обеспечит, на стороне сервера:

params[ :color ] == [ 'red', 'green', 'blue' ] 

Если есть обеспечить params таким образом, вы можете воспользоваться символом массива 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 принимает Params, имеющий массив в качестве значения, но не трогайте ключ обозначения. Итак, если вы измените ключ "color" на обычное соглашение о параметрах, вы должны использовать "color[]".

Это точно, что вы делаете не хотите сделать в вашем случае. Оставляя ключ как "color", он достигнет желаемого результата.

+0

Правильно, но это отправляется в другую форму (а не на мой сайт). Поэтому мне нужно передать несколько «цветных» параметров, но с разными значениями. Мне, вероятно, придется создать строку параметров для отправки, вместо того, чтобы пытаться отправить объект. –

+0

ОК, отредактированный, чтобы –

Смежные вопросы