我可以设置包含区域设置和路径的路由吗?默认情况下路由中的区域设置何时未提供?

时间:2013-10-20 22:01:55

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

我目前有需要语言环境的路由(即/ en,/ fr等)。在某些时候,我使用了routes.rb中的所有语句:

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

scope "/:locale", defaults: { :locale => "en" } do

scope "/:locale" do

我知道如果我执行以下操作,如果路由不包含它将指向网站英文版的区域设置。但是,一旦页面显示,它不会像我想要的那样设置区域设置。如果我通过单击我的语言环境逻辑转到法语版本,则第一个链接将在链接中显示带有/ fr的页面的法语版本。但是,如果我单击法语页面上的其他链接,则语言环境将返回到英语,并且链接中不包含区域设置。

scope "(/:locale)", defaults: { :locale => "en" } do

以下是我的应用程序中我的区域设置链接的代码,用户可以单击标记图像或文本来更改区域设置:

<%= link_to_unless_current image_tag("english.jpg", alt: "#{t :english}"), locale: "en" %> <%= link_to_unless_current "#{t :english}", locale: "en" %>
<%= link_to_unless_current image_tag("french.jpg", alt: "#{t :french}"), locale: "fr" %> <%= link_to_unless_current "#{t :french}", locale: "fr" %>

我想做的是防止500系统错误,如果有人在网站本地化之前保存了链接。例如,如果他们有http://mywebsite.com/video,则会显示网站的英文版本并将区域设置设置为“en”。

这是我在application_controller.rb中的代码。

  before_filter :set_locale

  def default_url_options(options={}) 
    { :locale => I18n.locale }
  end

  private
    def set_locale
      I18n.locale = (params[:locale] if params[:locale].present?) || cookies[:locale] || 'en'
      cookies[:locale] = I18n.locale if cookies[:locale] != I18n.locale.to_s
    end

除了使用routing-filter gem之外,我在这个特定问题上找不到任何东西。我正在使用gem,但是直到有Rails 4的gem的生产版本,我别无选择,只能想出这个路由问题。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我发现你的问题相当令人困惑......所以我的答案会引用你代码的某些部分。也许这会给你足够的背景来解决你的问题。

  1. 不要使用3条路线进行区域设置
  2. 一条路线就够了,请阅读the guides for internationlization

    我认为您必须使用可选方法,因为您希望支持旧网址:

    scope "(/:locale)" {}

    1. 使用config.default_locale选项
    2. 在配置中,您可以配置后备以进行本地化。

      1. 不要混用default_url_optionscookies
      2. 如果您使用Cookie来跟踪您的语言环境,则可以跳过default_url_options,无论如何都必须保留未定位的版本以便向后兼容。

        如果你必须有像domain.com/en/something这样的网址,那就相反了。避免使用cookie,在任何地方使用URL并重定向来自遗留URL的人。