通过get请求在Rails中传递参数数组

49

如何在Rails中通过Get方法传递参数数组?目前我的URL看起来像这样:

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

如何使用Get方法传递数组但避免?ids[]=1025&ids[]=1027这部分?

请求是通过JavaScript的window.open方法发送的。是否有任何解决方法可以发送非ajax的Post请求。


不行,这是一个庞大的项目。代码太复杂了。我只需要知道是否有一种方法可以通过get方法传递数组,而避免URL看起来像这样。 - Rafael Sedrakyan
不。实际上我需要一些解决方法,以免通过URL传递ID。 - Rafael Sedrakyan
在这里找到了我的问题的答案:https://dev59.com/3HVC5IYBdhLWcg3w9GLM。感谢大家的回复。 - Rafael Sedrakyan
4个回答

130

如果您不更改任何状态,并且只想访问只读值,则应坚持使用GET请求。

要在GET请求中向Rails发送ID数组,只需在变量名称后面加上方括号即可。

//angular snippet

$http.(method:'GET',
  ...
  params: {'channel_id':2, 'product_ids[]': productIds}  
  //where productIds is an array of integers
  ...
)
不要将您的ID连接为逗号分隔的列表,而是逐个冗余地传递它们。因此,在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"]}

7
使用"product_ids[]=6900&product_ids[]=6901"方法传递参数列表时,请点赞(+1)。 - Lakota Lefler
1
被接受的答案对于通过网络搜索找到此页面的人并不有用,而这个答案是有用的,所以我会点赞。然而,我们也应该注意到被接受的答案更具体地回答了问题,因为OP已经说明他已经知道方括号语法。 - mastazi
我正在使用Rails 5,变量名末尾的方括号似乎没有什么区别。如果不包括它们,它仍然可以工作。有人可能会认为这样更清晰,你正在传递一个数组...对我来说,它的复数已经足够好了。 - Greg Blass
快要完成了。如果您这样做,那么请求看起来像这样:product_ids[][]=6900&product_ids[][]=6901。为了生成正确的 URL,请这样做:params: {'channel_id':2, 'product_ids': productIds}。然后它将生成 URL:product_ids[]=6900&product_ids[]=6901 - Maris
这将整数数组转换为字符串数组。有什么解决方法吗? - Pants

25

不行,GET只能将变量放在URL上。如果你想让URL变短,你必须使用POST方法。这是HTTP的一项特性,而不是Rails的限制。


或者找到另一种不使用大数组过滤它的方法。 - YuriAlbuquerque
实际上,HTTP规范并没有明确说明 GET 请求是否可以带有请求体。这是Web服务器遵循的约定。如果有人要扩展Web服务器以读取 GET 的HTTP主体,则您也可以通过 GET 请求传递请求正文(前提是找到/修改客户端以通过 GET 请求传递请求正文)。 - kapad

15

最近我想要做这件事,找到了一个解决方法,它不太复杂,但也有一些限制,可能更容易实现。无法保证安全性,等等。

如果您将数组值作为带有分隔符的字符串传递,例如

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

等等


0

@Homan的回答适用于使用外部客户端(例如 curl 或 angular)。但是在Rails测试用例中,你不应该使用[]。这里有一个示例:

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

这是使用新格式,其中get_test_cases是路由名称,你需要将构建URL路径所需的所有参数传递给该方法。查询参数是一个单独的哈希表。
顺便说一下,如果我使用像case_ids[]这样的符号,那么代替["NON-9450"、 "NON-12345"、 "NON-9361"] ,它会被解析为[["NON-9450"], ["NON-12345"], ["NON-9361"]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接