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?
我建议只坚持使用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.escape和URI.escape。