Маршрутизация локали Rails I18n и тестирование RSpec

Мое приложение было написано на английском, и все было хорошо. Вчера начал играть с поддержкой интернационализации Rails.I18n. Все хорошо. Когда я просматриваю http://localhost:3000/jp/discounts, он на японском, и «http: // localhost: 3000 / Discount» дает мне английский язык по умолчанию (если языковой стандарт не указан).

Вот мой route.rb, и, как видите, пространство имен администратора не локализовано:

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']
]

person lulalala    schedule 08.02.2012    source источник
comment
Что произойдет, если вы переместите свой namespace :admin блок над своим scope блоком?   -  person Brandan    schedule 08.02.2012
comment
Спасибо! Устраняет большинство ошибок (оставшаяся проблема - другая). Но я не понимаю, как это работает: как мой прицел влияет на что-то за его пределами? Не могли бы вы написать ответ и можно ли пояснить?   -  person lulalala    schedule 08.02.2012


Ответы (1)


Когда Rails пытается сопоставить данный URL-адрес с маршрутом, он начинается с вершины файла config/routes.rb и останавливается на первом маршруте, который считает совпадающим. Поскольку в вашем исходном вопросе сначала у вас был блок scope, Rails подумал, что ваши /admin URL-адреса указывают маршрут с :locale => 'admin'.

Вам нужно, чтобы Rails соответствовал путям, начинающимся с /admin, с вашим пространством имен администратора. Помещая это первым в свой файл маршрутов, вы заставляете Rails «перестать искать», как только он найдет это совпадение.

Это грубое упрощение, но я надеюсь, что это поможет.

Также ознакомьтесь с руководством по маршрутизации Rails, если вы еще этого не сделали.

person Brandan    schedule 08.02.2012