简体   繁体   中英

Rails I18n locale routing and RSpec testing

My application was written in English and it was all good. Yesterday I starts to play with the Rails.I18n internationalization support. It is all good. When I browse http://localhost:3000/jp/discounts it is in Japanese, and 'http://localhost:3000/discounts' gives me the default English locale (when locale is not specified).

Here is my route.rb and as you can see, the admin namespace is not localized:

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

However my RSpec starts to fail.

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"}>

The tests related to admin all have this kind of problem. How can I resolve this? It works fine in development.

Here are other locale-related code:

application_controller.rb

  def default_url_options
    { locale: I18n.locale }
  end

config/initializers/i18n.rb

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

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

When Rails attempts to match a given URL to a route, it starts at the top of the config/routes.rb file and stops at the first route that it considers to be a match. Since, in your original question, you had the scope block first, Rails thought your /admin URLs indicated a route with :locale => 'admin' .

You need Rails to match paths beginning in /admin to your admin namespace. By placing that first in your routes file, you cause Rails to "stop looking" once it finds that match.

This is a gross oversimplification, but I hope it's helpful.

Also check out the Rails routing guide if you haven't already.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM