gpt4 book ai didi

ruby-on-rails - Rails url helper 不编码&符号

转载 作者:行者123 更新时间:2023-12-04 01:35:41 26 4
gpt4 key购买 nike

因此,我尝试使用 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"

但出于某种奇怪的原因,&符号没有逃脱:
(rdb:1) page_url('foo_&_bar', :host => 'host')
"http://host/pages/foo_&_bar"

如果我预先逃脱它们,它们就会被破坏:
(rdb:1) page_url('foo_%26_bar', :host => 'host')
"http://host/pages/foo_%2526_bar"
CGI::escape ,另一方面,可以很好地逃脱它们:
(rdb:1) CGI::escape('foo_&_bar')
"foo_%26_bar"

这是怎么回事,我该如何解决这个问题? (就是比 gsub('&', '%26') 更好的东西。)

最佳答案

我不能告诉你一个更好的方法来处理它 - 但我可以解释它为什么会发生。

&符号不是 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-methods 深处的东西……但最终调用了 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"

如果不向 Rails 团队提出实际的功能请求,目前您无能为力。

...除非您可以选择不在 URL 中使用与号
您可以随时为所有 URL 自行 gsub:
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'))

关于ruby-on-rails - Rails url helper 不编码&符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4394381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com