rails可选路径范围,带有重定向

时间:2017-02-05 02:55:09

标签: ruby-on-rails routing

Rails Documentation说:

# config/routes.rb
scope "(:locale)", locale: /en|nl/ do
  resources :books
end
  

使用此方法,在没有区域设置的情况下访问http://localhost:3001/books等资源时,您将无法获得 Routing Error 。当您想要在未指定默认语言环境时使用默认语言环境时,这非常有用。

我希望不正确/缺失区域设置重定向 ...不是路由错误!

例如,访问localhost:3000/asdf/books时应重定向到localhost:3000/en/books

为什么?因为我继承了一个没有任何限制的应用程序,谷歌分析显示了一堆随机/无效区域设置的访问。我希望保持链接正常工作以改善互联网并将其转发到正确的URL。比显示404更好的用户体验。

2 个答案:

答案 0 :(得分:2)

要重定向不正确的区域设置,请在范围后添加以下内容:

TZ=

要重定向缺少区域设置,请从以下位置更改范围:

moment(1399089600000).utcOffset()

为:

get '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}")

这样,语言环境不再是可选的。最后,重定向缺少语言环境的路径:

scope '(:locale)', locale: /en|nl/ do

最终结果:

scope ':locale', locale: /en|nl/ do

答案 1 :(得分:1)

您可以在应用程序控制器中捕获它。在你的路线:

scope "/:locale" do
  resources :books
end

然后在app / controllers / application_controller.rb中:

before_action :set_locale
def set_locale
  unless I18n.available_locales.map(&:to_s).include?(params[:locale])
    redirect_to foo_url(locale: :en)
  end
end