Rails I18n语言环境路由和RSpec测试

时间:2012-02-08 02:29:29

标签: ruby-on-rails internationalization rspec rspec2

我的申请是用英文写的,一切都很好。昨天我开始玩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

配置/初始化/ i18n.rb

#encoding: utf-8
I18n.default_locale = :en

LANGUAGES = [
  ['English', 'en'],
  ["Japanese", 'jp']
]

1 个答案:

答案 0 :(得分:2)

当Rails尝试将给定的URL与路由匹配时,它会从config/routes.rb文件的顶部开始,并在它认为匹配的第一条路径处停止。由于您在原始问题中首先获得scope阻止,因此Rails认为您的/admin网址指示的路线为:locale => 'admin'

您需要Rails将从/admin开始的路径与管理命名空间进行匹配。通过将第一个放在路径文件中,一旦找到匹配就会导致Rails“停止查找”。

这是一个粗略的过度简化,但我希望它有用。

如果您还没有,请查看the Rails routing guide