Как отправить несколько одинаковых ключей/параметров через POST?

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

Представьте форму с несколькими флажками, все они имеют один и тот же атрибут 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)

Я не могу контролировать принимающую сторону, поэтому мне приходится отправлять параметры так, как она ожидает их получить. Как?


person Josh M.    schedule 25.09.2013    source источник


Ответы (2)


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

У вас не может быть этого, так как это приведет к тому, что у Ruby будет один ключ:

> { 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

И отправить как:

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", вы достигнете желаемого результата.

person kik    schedule 25.09.2013
comment
Верно, но это публикуется в другой форме (не на моем сайте). Поэтому мне нужно передать несколько параметров цвета, но с разными значениями. Мне, вероятно, придется создать строку параметров для отправки вместо того, чтобы пытаться отправить объект. - person Josh M.; 25.09.2013

Можно не просто:

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

Для других идей вы также можете увидеть это name?rq=1">похожая запись.

person ljs.dev    schedule 25.09.2013
comment
Принимающая сторона не размещается на рельсах. - person Josh M.; 25.09.2013
comment
хорошо, тогда похоже, что вам нужно использовать метод по ссылке выше. вы можете обновить вопрос, чтобы указать, что вы не можете контролировать принимающую сторону - person ljs.dev; 25.09.2013