防止在url助手中转义斜杠(特别是在使用.send()调用url_helpers时)

时间:2015-06-22 19:47:56

标签: ruby-on-rails-4

也许这个问题的标题是神秘的,但问题是真的,我刚刚将一个应用程序从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

1 个答案:

答案 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]