启动轨道I18n和url助手似乎将区域设置与id混淆

时间:2014-06-08 04:37:34

标签: ruby-on-rails ruby-on-rails-3 internationalization rails-i18n

我刚刚开始尝试更新我们的rails 3.2应用程序以进行国际化。我在路线中有一个可选的范围,比如

  

范围"(:locale)",locale:/ en | es | zh-HK | de | fr / do

http://guides.rubyonrails.org/i18n.html描述。

我的网址助手就像

  

watch_url(@watch)

以表格

获取错误
  

没有路由匹配{:action =>" show",:controller =>" watch",:locale =>#< Watch id:1,rule_name: " MyRule",start_time:" 2014-06-08 03:30:03",end_time:nil,last_execution_time:nil,frequency_mins:60,rest_period:0,enabled:true,last_rule_result :false,所有者:" me",one_shot:false,args:{" x" =>"","收件人" = >"","属性" =>""},状态:{},隐藏:false,评论:"&#34 ;>}

关于它为什么会发生以及如何解决它的任何想法?

谢谢!

编辑:

在我的应用程序控制器中,我有

  before_filter :set_locale

  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end

手表控制器的路线(这是一个8岁的专有应用程序,我们有100多个控制器:(所以我不会包括所有路线)......

$ rake routes | grep watch
                              watches GET    (/:locale)/watches(.:format)                                                         watches#index  {:locale=>/en|es|zh-HK|de|fr/}
                                      POST   (/:locale)/watches(.:format)                                                         watches#create {:locale=>/en|es|zh-HK|de|fr/}
                            new_watch GET    (/:locale)/watches/new(.:format)                                                     watches#new {:locale=>/en|es|zh-HK|de|fr/}
                           edit_watch GET    (/:locale)/watches/:id/edit(.:format)                                                watches#edit {:locale=>/en|es|zh-HK|de|fr/}
                                watch GET    (/:locale)/watches/:id(.:format)                                                     watches#show {:locale=>/en|es|zh-HK|de|fr/}
                                      PUT    (/:locale)/watches/:id(.:format)                                                     watches#update {:locale=>/en|es|zh-HK|de|fr/}
                                      DELETE (/:locale)/watches/:id(.:format)                                                     watches#destroy {:locale=>/en|es|zh-HK|de|fr/}

我不认为show方法是相关的。错误发生在url帮助器中,并且流程永远不会到达show代码。

1 个答案:

答案 0 :(得分:1)

You need to give the url helper a locale option也是为了让它正确传递:

watch_url(@watch, locale: I18n.locale)

如果这有点烦人,您可以覆盖Rails url_options方法,始终为每个请求提供:locale选项,这样您就不必在任何视图中指定它(一些指南,包括上面的Rails指南链接,说要覆盖default_url_options方法,但这对我不起作用......):

应用/控制器/ application_controller.rb

class ApplicationController < ActionController::Base
  # Every helper method dependent on url_for (e.g. helpers for named
  # routes like root_path or root_url, resource routes like books_path
  # or books_url, etc.) will now automatically include the locale in
  # the query string,
  def url_options
    { locale: I18n.locale }.merge(super)
  end

  # ...
end

应用/视图/ your_view

# locale not needed explicitly as it's set in the controller
<%= link_to watch_url(@watch) %>