【问题标题】:Passing array of parameters through get in rails通过get in rails传递参数数组
【发布时间】:2017-01-16 03:43:15
【问题描述】:

如何通过 Rails 中的 Get 方法传递参数数组?目前我的网址是这样的:

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 以这种方式显示。
  • 没有。实际上我需要一些解决方法来不通过 URL 传递 id。
  • stackoverflow.com/questions/133925/… 找到我的问题的答案。感谢大家的回复。

标签: ruby-on-rails http


【解决方案1】:

如果你不改变任何东西的状态,你应该坚持使用 GET 请求,并且你只想访问只读值。

要在 GET 请求中将一组 id 发送到 rails,只需在末尾用方括号命名变量即可。

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

【讨论】:

  • +1 用于使用“product_ids[]=6900&product_ids[]=6901”方法传递参数列表
  • 接受的答案对人们通过网络搜索找到此页面没有帮助,而这个是,所以我赞成。但是,我们还应该注意,接受的答案是更具体地回答问题的答案,因为 OP 表示他已经知道方括号语法。
  • 我使用的是 Rails 5,变量名末尾的方括号似乎没有什么区别。如果你不包括它们,它仍然有效。有人可能会争辩说,你传递一个数组更清楚……对我来说,它的复数就足够了。
  • 快到了。如果您这样做,那么请求将如下所示:product_ids[][]=6900&product_ids[][]=6901。要使其生成正确的 URL,请执行以下操作:params: {'channel_id':2, 'product_ids': productIds}。然后它会生成 URL:product_ids[]=6900&product_ids[]=6901.
【解决方案2】:

不,GET 只能将变量放在 url 本身上。如果您希望 URL 更短,则必须 POST。这是 HTTP 的 限制 功能,而不是 Rails。

【讨论】:

  • 或者找到另一种不使用巨大数组的过滤方式。
  • 实际上,HTTP 规范并没有具体说明 GET 请求是否可以有正文。这是 Web 服务器遵循的约定。如果有人要扩展 Web 服务器来读取 GET 的 HTTP 正文,那么您也可以传入带有 GET 请求的正文。 (假设您找到/修改客户端以通过 GET 请求传递正文)。
【解决方案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 路径所需的所有参数传递给该方法。查询参数是一个单独的哈希。

    仅供参考,如果我使用 case_ids[] 之类的 [],那么我会将其解析为 [["NON-9450"], ["NON-12345"], ["NON-9361"]] 而不是 ["NON-9450", "NON-12345", "NON-9361"]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多