Подтвердить что ты не робот

Передача массива параметров через рельсы

Как передать массив параметров через метод Get в rails? В настоящее время мой URL looc выглядит следующим образом:

http://localhost:3000/jobs/1017/editing_job_suites/1017/editing_member_jobs/new?ids[]=1025&ids[]=1027

Как передать массив с помощью метода Get, но избегать ?ids[]=1025&ids[]=1027 part.

Запрос отправляется с помощью метода javascript window.open. Есть ли какое-либо обходное решение для отправки запроса ajax Post.

4b9b3361

Ответ 1

Нет, GET может помещать переменные непосредственно в url. Если вы хотите, чтобы URL-адрес был короче, вы должны ПОСТ. Это функция ограничения для HTTP, а не Rails.

Ответ 2

Вы должны придерживаться использования запроса GET, если вы не меняете состояние чего-либо, и все, что вы хотите получить доступ к значению только для чтения.

Чтобы отправить массив идентификаторов в рельсы в запросе GET, просто укажите свою переменную с квадратными скобками в конце.

//angular snippet

$http.(method:'GET',
  ...
  params: {'channel_id':2, 'product_ids[]': productIds}  
  //where productIds is an array of integers
  ...
)

Не объединяйте свои идентификаторы как список, разделенный запятыми, просто передавайте их индивидуально избыточно. Таким образом, в URL-адресе он выглядит примерно так:

?channel_id=2&product_ids[]=6900&product_ids[]=6901

URL-код, который будет закодирован, на самом деле будет примерно таким:

?channel_id=2&product_ids%5B%5D=6900&product_ids%5B%5D=6901

Rails отделяет это для вас.

Parameters: {"channel_id"=>"2", "product_ids"=>["6900", "6901"]}

Ответ 3

Недавно я хотел сделать это и нашел обходное решение, которое немного менее сложно, и поэтому имеет некоторые ограничения сложности, но также может быть проще реализовать. Не могу говорить о безопасности и т.д.

Если вы передадите значения массива в виде строки с разделителем, например

http://example.com/controller?job_ids=2342,2354,25245

Затем вы можете взять результат и проанализировать его обратно на то, что вы хотите:

job_ids = params[:job_ids].split(',')

Затем сделайте что угодно:

    job_ids.each do |job_id|
      job = Job.find(job_id.to_i)
    end

и т.д.

Ответ 4

Ответ @Homan действителен для использования внешнего клиента (например, curl или angular). Внутри Rails-теста, вы не должны использовать []. Вот пример:

get get_test_cases_url(**path_params), params: {case_ids: ["NON-9450", "NON-12345", "NON-9361"]}

Это использует новый формат, где get_test_cases - это имя маршрута, и вы передаете методу все параметры, необходимые для построения пути URL. Параметры запроса представляют собой отдельный хеш.

FYI, если я использую [] как case_ids[], тогда вместо ["NON-9450", "NON-12345", "NON-9361"] я получаю его разобранным до [["NON-9450"], ["NON-12345"], ["NON-9361"]]