如何在Rails中使用空格为'%20'而不是'+'来获取URL的参数

Ale*_*rra 9 ruby ruby-on-rails url-encoding

如果我有这个参数添加到URL

params = { name: 'John Key' }

并使用方法to_param:

params.to_param
 => "name=John+Key"
Run Code Online (Sandbox Code Playgroud)

关键是所使用的服务无法正确读取'+',而是需要'%20' name=John%20Key:何时将空间编码为加号(+)或%20?

有没有办法在没有使用的情况下使用'%20'返回参数gsub

Tom*_*ord 5

我建议只坚持使用gsub,也许要加上注释来解释这种行为的必要性。

尽管您可以使用解决问题URI.escape,但由于它不完全符合RFC规范,因此它已被弃用。看到这里有关它的精彩文章。

Hash#to_param是的别名Hash#to_query,它调用Object#to_query。展示此+vs %20问题的最简单示例是:

'John Key'.to_query(:name) # => "name=John+Key"
Run Code Online (Sandbox Code Playgroud)

的实现Object#to_query是:

def to_query(key)
  "#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}"
end
Run Code Online (Sandbox Code Playgroud)

因此,我们发现:

CGI.escape("John Key") # => "John+Key"
Run Code Online (Sandbox Code Playgroud)

因此,这就是为什么我引用之间的差异CGI.escapeURI.escape