# coding: utf-8

5.2.2 Rails маршруты

Теперь, когда у нас есть тесты для URL, такие как мы хотим, пришло время заставить их работать. Как отмечалось в Разделе 3.1.2, Rails использует для отображения маршрутов файл config/routes.rb. Если вы посмотрите на дефолтный (по умолчанию) файл routes.rb, вы увидите беспорядок, но это полезный беспорядок — полный примеров закомментированных отображений маршрутов. Я советую почитать его как-нибудь, а также взглянуть на Rails Guides article “Rails Routing from the outside in” (# перевод этой статьи, а также многих других из данного руководства можно найти на сайте https://www.rusrails.ru/) для более углубленного изучения маршрутов. Сейчас, однако, мы будем придерживаться примеров в Листинге 5.18.9

Листинг 5.18. Маршруты для статических страниц.
config/routes.rb
  SampleApp::Application.routes.draw do
    match '/contact', :to => 'pages#contact'
    match '/about',   :to => 'pages#about'
    match '/help',    :to => 'pages#help'
    .
    .
    .
  end

Листинг 5.18 содержит пользовательские маршруты для contact, about, и help страниц; маршрутом для home страницы мы озаботимся в Листинге 5.20. (Раз уж мы будем пользоваться маршрутами из Листинга 5.18 исключительно с этого момента, мы воспользуемся этой возможностью чтобы удалить маршруты контроллера Pages (get "pages/home", и т.д.) последний раз мы их видели в Листинге 3.17.)

Если Вы вчитаетесь в код Листинга 5.18 повнимательнее, Вы, вероятно, сможете понять что он делает; например, Вы можете видеть, что

  match '/about', :to => 'pages#about' 

отождествляет ’/about’ и направляет его к about действию контроллера Pages. До этого было более четко: мы использовали get ’pages/about’ чтобы попасть в то же место, но /about более кратко. Не очевидным является то, что match ’/about’ также автоматически создает именованные маршруты для использования в контроллерах и представлениях:

  about_path => '/about' 
  about_url => 'https://localhost:3000/about' 

Обратите внимание, что about_url это полный URL https://localhost:3000/about (localhost:3000 заменится на доменное имя, например example.com, при полном развертывании сайта). Как уже говорилось в Разделе 5.2, чтобы получить только /about, вы используете about_path. (Rails Tutorial использует path использует _path форму по соглашению, но разница редко имеет значение на практике (# т.е также возможно применение _url формы).)

С помощью этих маршрутов, теперь определенных, тесты для About, Contact, и Help страниц должны пройти (Как обычно, используйте Autotest или rspec spec/ для проверки.) Кроме теста для Home страницы.

Чтобы установить соответствие маршрута для домашней страницы, мы могли бы использовать код подобный этому:

  match '/', :to => 'pages#home' 

но это не является необходимым; Rails имеет специальный маршрут для корневого URL / (“слэш”) расположенный внизу файла (Листинг 5.19).

Листинг 5.19. Раскоментирование подсказки для определения root маршрута.
config/routes.rb
  SampleApp::Application.routes.draw do
    .
    .
    .
    # You can have the root of your site routed with "root"
    # just remember to delete public/index.html.
    # root :to => "welcome#index"
    .
    .
    .
  end

Используя Листинг 5.19 как модель, мы приходим к Листингу 5.20 чтобы направить root URL / к Home странице.

Листинг 5.20. Добавление соответствия для root маршрута.
config/routes.rb
  SampleApp::Application.routes.draw do
    match '/contact', :to => 'pages#contact'
    match '/about',   :to => 'pages#about'
    match '/help',    :to => 'pages#help'

    root :to => 'pages#home'
    .
    .
    .
  end

этот код направляет root URL / к /pages/home, и также дает URL помощника следующим образом:

  root_path => '/' 
  root_url => 'https://localhost:3000/' 

Мы должны также прислушаться к коментарию в Листинге 5.19 и удалить public/index.html чтобы предотвратить визуализацию дефолтной страницы (Рис. 1.3) при посещении /. Конечно, Вы можете просто удалить файл выполненив Move to trash в текстовом редакторе, но если вы используете Git для контроля версий, есть способ удалить файл и в тоже время сообщить Git об удалени — с помощью git rm:

  $ git rm public/index.html
  $ git commit -am "Removed default Rails page" 

Вы можете вспомнить из Раздела 1.3.5 что мы использовали Git команду git commit -a -m "Message", с флагами для “все изменения” (-a) и сообщения (-m). Как показано выше, Git также позволяет скрутить два флага в один git commit -am "Message".

При этом, все маршруты для статических страниц работают, и тесты должны пройти. Теперь мы просто должны заполнить ссылки в макете.

# coding: utf-8