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)
这样,您确定区域设置不会发送到路径助手.
| 归档时间: |
|
| 查看次数: |
16426 次 |
| 最近记录: |