Ответ 1
Нет, GET может помещать переменные непосредственно в url. Если вы хотите, чтобы URL-адрес был короче, вы должны ПОСТ. Это функция ограничения для HTTP, а не Rails.
Как передать массив параметров через метод 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.
Нет, GET может помещать переменные непосредственно в url. Если вы хотите, чтобы URL-адрес был короче, вы должны ПОСТ. Это функция ограничения для HTTP, а не Rails.
Вы должны придерживаться использования запроса 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"]}
Недавно я хотел сделать это и нашел обходное решение, которое немного менее сложно, и поэтому имеет некоторые ограничения сложности, но также может быть проще реализовать. Не могу говорить о безопасности и т.д.
Если вы передадите значения массива в виде строки с разделителем, например
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
и т.д.
Ответ @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"]]