带有可选范围":locale"的Rails路由

jlf*_*aux 12 url-routing ruby-on-rails-3.1

我正在研究Rails 3.1应用程序,我想为应用程序支持的不同语言设置特定路由.

/es/countries
/de/countries
…
Run Code Online (Sandbox Code Playgroud)

对于默认语言('en'),我不希望语​​言环境显示在URL中.

/countries
Run Code Online (Sandbox Code Playgroud)

这是我设定的路线定义.

scope "(:locale)", :locale => /es|de/ do
   resources :countries
end
Run Code Online (Sandbox Code Playgroud)

它很好用,直到我尝试使用带有'en'的路径助手作为语言环境.

在控制台中:

app.countries_path(:locale => 'fr')
 => "/fr/countries" 

app.countries_path(:locale => 'en')
 => "/countries?locale=en" 
Run Code Online (Sandbox Code Playgroud)

我不想要"?locale = en".

有没有办法告诉rails使用'en'语言环境,不应该将语言环境参数添加到url?

谢谢

Arc*_*lye 22

这应该是一个更好的解决方案:

在您的routes.rb中,

scope "(:locale)", locale: /#{I18n.available_locales.join("|")}/, defaults: {locale: "en"} do
Run Code Online (Sandbox Code Playgroud)

正如MegaTux所说,设定defaults: {locale: "en"}在范围内.

优势: jlfenaux解决方案适用于大多数环境,但不是全部.在某些上下文中(基本上与主控制器和视图之外的任何内容一样),路径助手会混淆并将对象或object.id放在locale参数中,这将导致错误.您会发现自己会放置locale: nil许多路径助手来避免这些错误.

可能的问题: 似乎defaults: {locale: "en"}总是覆盖您传入的任何其他值locale.该选项已命名default,因此我希望它只在没有值的情况下才将区域设置分配给'en',但事实并非如此.有没有其他人经历过这个?


jlf*_*aux 16

我终于想出了如何轻松地做到这一点.您只需在app控制器中设置default_url_options,如下所示.

  def default_url_options(options={})
    { :locale => I18n.locale == I18n.default_locale ? nil : I18n.locale  }
  end
Run Code Online (Sandbox Code Playgroud)

这样,您确定区域设置不会发送到路径助手.

  • 或者在范围定义中设置默认值:`scope"(:locale)",locale:/ en | es /,defaults:{locale:"en"} do` (2认同)