我刚刚开始尝试更新我们的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代码。
答案 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) %>