jpa*_*kal 11 ruby-on-rails helper url-encoding
所以我正在尝试使用Rails URL帮助程序(page_url)来创建包含特殊字符的URL,包括&符号.大多数情况的工作方式与您期望的一样:
(rdb:1) page_url('foo', :host => 'host')
"http://host/pages/foo"
(rdb:1) page_url('foo_%_bar', :host => 'host')
"http://host/pages/foo_%25_bar"
Run Code Online (Sandbox Code Playgroud)
但由于一些奇怪的原因,&符号没有被转义:
(rdb:1) page_url('foo_&_bar', :host => 'host')
"http://host/pages/foo_&_bar"
Run Code Online (Sandbox Code Playgroud)
如果我预先逃脱它们,它们就会被破坏:
(rdb:1) page_url('foo_%26_bar', :host => 'host')
"http://host/pages/foo_%2526_bar"
Run Code Online (Sandbox Code Playgroud)
CGI::escape另一方面,他们逃脱了罚款:
(rdb:1) CGI::escape('foo_&_bar')
"foo_%26_bar"
Run Code Online (Sandbox Code Playgroud)
发生了什么,我该如何解决这个问题?(有更好的东西gsub('&', '%26'),就是这样.)
Tar*_*ast 15
我不能告诉你一个更好的方法来解决它 - 但我可以解释它为什么会发生.
&符号不是URL的无效字符.否则你会遇到以下问题:" http:// host/pages/foo?bar = baz&style = foo_style "或者其他什么.
编辑:深入挖掘源代码,看起来Rails只在参数上使用CGI.escape.
帮助器,url-generators使用url_for(在封面下),最终调用:http: //apidock.com/rails/ActionController/Routing/Route/generate哪些调用源代码的sprivate方法中的东西.但最终最终调用CGI.escape(首先查看actionpack/lib/action_controller/routing/route.rb然后在actionpack/lib/action_controller/routing/segments.rb中)
最终的结果是,在url本身,rails使用URI.escape - 特别是根本不更新&符号:
>> CGI.escape('/my_foo_&_bar')
=> "%2Fmy_foo_%26_bar"
>> URI.escape('/my_foo_&_bar')
=> "/my_foo_&_bar"
Run Code Online (Sandbox Code Playgroud)
如果没有将实际的功能请求添加到rails团队,您目前无法做到这一点.
...除非您可以选择不在URL中使用&符号您可以随时自行为所有URL添加&
def my_clean_url(the_url)
   return the_url.gsub(/&/,'_')
end
>> my_clean_url('/my_foo_&_bar')
=> "/my_foo___bar"
page_url(my_clean_url('/my_foo_&_bar'))
Run Code Online (Sandbox Code Playgroud)
        svo*_*oop 10
对于那些试图只编码除az,AZ,0-9和下划线以外的任何东西的人:
URI.encode(string, /\W/)
Run Code Online (Sandbox Code Playgroud)
假设您有一些内容可能包含例如&符号,并且您希望将此内容用作链接的body参数mailto:如果没有/\W/,则&符号(这是一个安全的URI字符)将不会被编码,因此会部分断开链接.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           7657 次  |  
        
|   最近记录:  |