我最近关注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
由于
答案 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