使用带有Rails的I18n时重定向将正斜杠编码为%2F

时间:2012-07-10 17:50:18

标签: ruby-on-rails internationalization url-routing i18n-gem

我最近关注Ryan Bate's Railscast on I18n添加了多个位置并设置了URL Params中的区域设置,如

www.example.com/en/
www.example.com/fr/

一般情况下它会起作用,但我注意到如果我手动尝试从网址中删除该位置,则生成的重定向无法正确形成,似乎编码/进入%2F。例如,如果我从

中删除网址

www.example.com/fr/animals/horses
所以它是www.example.com/animals/horses

然后重定向产生以下网址:
www.example.com/fr/animals%2Fhorses

这是我的routes.rb

的一部分
scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
 resources animals
end

match '*path', to: redirect("/#{I18n.default_locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }
match '', to: redirect("/#{I18n.default_locale}")

我试图想出一种方法将CGI :: escape放到{path}中,但到目前为止我没有尝试过任何方法。有谁知道正确的代码来解决这个问题?

Rails 3.2.6 / Ruby 1.9.2

由于

2 个答案:

答案 0 :(得分:9)

我猜你需要做的是使用一个块:

match '*path', to: redirect {|params| "/bla/#{CGI::unescape(params[:path])}" }

查看指南以获取更多信息http://guides.rubyonrails.org/routing.html#redirection

答案 1 :(得分:0)

只需将范围设为可选添加括号"(:locale)",这样就不需要匹配或重定向任何内容

scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/ do
  resources animals
end