无法将url params字符串转换为hash,然后返回url字符串

时间:2017-07-25 13:34:20

标签: ruby-on-rails ruby url

输入是一个参数字符串(输入格式无法更改)

something=1,2,3,4,5&something_else=6,7,8

预期产出:

something=1,2,3,4,5&something_else=6,7,8

我在做什么:

params = 'something=1,2,3,4,5'
CGI::parse(params)
CGI.unescape(CGI.parse(params).to_query)

我将此作为输出:

something[]=1,2,3,4,5

当我做CGI::parse(params)时 我得到了这个:{"something"=>["1,2,3,4,5"]}

这是错误的,因为它不是一个数组,某个字符串是" 1,2,3,4,5"但是当我进行CGI解析时,它被转换为数组。

我需要进行CGI解析的原因是因为我需要操作URL PARAMS。

还有其他可能的方法可以以正确的方式转换它并保持params格式吗?

1 个答案:

答案 0 :(得分:2)

CGI模块是一个完整的恐龙,应该被抛入垃圾中,因为它有多糟糕,但由于某种原因它仍然存在于Ruby核心中。也许有一天有人会重构它并让它变得可行。在那之前,跳过它并使用更好的东西,比如URI,它也是内置的。

鉴于您的不规则,不合规的查询字符串:

query_string = 'something=1,2,3,4,5&something_else=6,7,8'

您可以使用处理查询字符串的decode_www_form方法来处理此问题:

require 'uri'
decoded = URI.decode_www_form(query_string).to_h
# => {"something"=>"1,2,3,4,5", "something_else"=>"6,7,8"}

要重新编码,您只需致电encode_www_form,然后强制unescape撤消正确处理,值的内容:

encoded = URI.unescape(URI.encode_www_form(decoded))
# => "something=1,2,3,4,5&something_else=6,7,8"

那应该得到你想要的效果。