【问题标题】:rails optional path scope with redirect带有重定向的可选路径范围
【发布时间】:2017-02-05 02:55:09
【问题描述】:

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 更好的用户体验。

【问题讨论】:

    标签: ruby-on-rails routing


    【解决方案1】:

    要重定向不正确的语言环境,请在范围后添加以下内容:

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

    要重定向缺少的语言环境,请将您的范围从:

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

    到:

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

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

    get '/*path', to: redirect("/#{I18n.default_locale}/%{path}"),
      constraints: lambda { |req| I18n.available_locales.none? { |locale| req.path.starts_with? locale.to_s } }
    

    最终结果:

    scope ':locale', locale: /#{I18n.available_locales.join("|")}/ do
      resources :books
    end
    
    get '/*locale/*path', to: redirect("/#{I18n.default_locale}/%{path}")
    get '/*path', to: redirect("/#{I18n.default_locale}/%{path}"),
      constraints: lambda { |req| I18n.available_locales.none? { |locale| req.path.starts_with? locale.to_s } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2012-09-25
      • 2012-01-03
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多