也许这个问题的标题是神秘的,但问题是真的,我刚刚将一个应用程序从Rails 3升级到4并遇到了以下问题(在Ruby 2.0和2.1上):
我有一个方法,使用send()在循环中调用几个url助手,如下所示:
class Sitemap
include Rails.application.routes.url_helpers
#...
# regions = [:city, :county, :zip]
regions.each do |region|
url_params = ... # [name, additional_id]
send("#{region}_url", url_params)
end
在Rails 3中,上面的结果是http://example.com/cities/atlanta/2
这样的网址在Rails 4中,我得到http://example.com/cities/atlanta%2f2
斜线让CGI逃脱,我不想要这个。我使用它为我的网站生成站点地图XML,它似乎工作,即使正斜杠被转义,但它看起来很难看,我不知道它是否适用于所有机器人或客户端。
更新:经过一些调试后我发现CGI转义发生在ActionDispatch :: Journey :: Visitors :: Formatter
的某个地方Router::Utils.escape_segment() # method call somewhere in
ActionDispatch::Journey::Visitors::Formatter # during
Visitors::Formatter.new(path_options).accept(path.spec) # in
@set.formatter.generate(:path_info, named_route, options, recall, PARAMETERIZE) # in a call to
ActionDispatch::Routing::RouteSet::Generator#generate
答案 0 :(得分:1)
我在生成网址时能够通过转义斜杠解决问题,这里有更改:
# from:
send(region_url, url_params)
# to:
send(region_url, { id: url_params[0], market_id: url_params[1]})
# sometimes url_params is a one element array
关键是提供具有明确分配的键和值的参数哈希。
我使用send来动态调用url_helpers模块中的方法(xxx_url),该模块包含在我的模型中。 url_params数组看起来像[' some-slug',12]