我的应用程序是用英语写的,一切都很好。昨天我开始玩Rails.I18n国际化支持。一切都很好。当我浏览http://localhost:3000/jp/discounts
时,它是日语的,并且'http://localhost:3000/discounts'为我提供默认的英语区域设置(当未指定区域设置时)。
这是我的route.rb,正如你所看到的,admin命名空间没有本地化:
scope '(:locale)' do
resources :discounts do
resource :map, only: :show
collection do
get :featured_city
end
end
end
namespace :admin do
resources :users do
collection do
get :members
get :search
end
end
end
然而,我的RSpec开始失败。
Failure/Error: it { should route_to('admin/users#edit', id: '1') }
The recognized options <{"action"=>"edit", "controller"=>"users", "locale"=>"admin", "id"=>"1"}>
did not match <{"id"=>"1", "controller"=>"admin/users", "action"=>"edit"}>,
difference: <{"controller"=>"admin/users", "locale"=>"admin"}>.
<{"id"=>"1", "controller"=>"admin/users", "action"=>"edit"}> expected but was
<{"action"=>"edit", "controller"=>"users", "locale"=>"admin", "id"=>"1"}>
与管理相关的测试都存在这种问题。我该如何解决此问题?它在开发中运行良好。
以下是其他与区域设置相关的代码:
application_controller.rb
def default_url_options
{ locale: I18n.locale }
end
config/iinitializers/i18n.rb
#encoding: utf-8
I18n.default_locale = :en
LANGUAGES = [
['English', 'en'],
["Japanese", 'jp']
]
当Rails试图将给定的URL与路由匹配时,它从config/routes.rb
文件的顶部开始,并在它认为匹配的第一个路由处停止。由于在您最初的问题中,您首先有scope
块,Rails认为您的/admin
URL指示了一条带有:locale => 'admin'
的路由。
您需要Rails将从/admin
开始的路径匹配到您的管理命名空间。通过将其放在routes文件中的第一个位置,可以使Rails在找到匹配项后"停止查找"。
这过于简单化了,但我希望它能有所帮助。
如果你还没有阅读Rails路由指南,也可以看看。