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
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).
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 странице.
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