Опубликован: 27.01.2016 | Доступ: свободный | Студентов: 913 / 58 | Длительность: 23:07:00
Лекция 5:

Заполнение шаблона

Rails маршруты

Теперь, когда у нас есть нужные нам тесты для URL, пришло время заставить их работать. Как отмечалось в Разделе 3.1, Rails использует для маршрутов файл config/routes.rb. Если вы посмотрите на дефолтный, файл routes.rb, вы увидите беспорядок, но это полезный беспорядок — полный закомментированных примеров маршрутов. Я советую почитать его как-нибудь, а также взглянуть на статью о маршрутах в (rus)Rails Guides для более углубленного изучения маршрутов.

Для того чтобы определить именованные маршруты нам необходимо заменить такие маршруты как

get 'static_pages/help'

на

match '/help', to: 'static_pages#help', via: 'get'

Это дает нам два варианта возможных варианта написания пути к странице help: /help (отвечающую на GET запросы) и именованный маршрут help_path который возвращает путь к этой странице. (На самом деле использование get вместо match даст тот же именованнный маршрут, но использование match более принято.)

Применение этого паттерна к остальным статическим страницам приводит нас к Листингу 5.24. Единственным исключением здесь является страница Home, о которой мы позаботимся в Листинге 5.26.

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

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

match '/about', to: 'static_pages#about',  via: 'get'

устанавливает соответствие между GET запросом к ’/about’ и именованным маршрутом, а также направляет его в about действие контроллера StaticPages. Прежде это было более очевидно: мы использовали

get 'static_pages/about'

для того чтобы попасть в то же место, но /about более краток. В дополнение, как отмечалось выше, код match ’/about’ также автоматически создает именованные маршруты для использования в контроллерах и представлениях:

about_path -> '/about'
about_url  -> 'http://localhost:3000/about'

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

После определения этих маршрутов тесты для About, Contact, и Help страниц должны пройти:

$ bundle exec rspec spec/requests/static_pages_spec.rb

Это оставляет один провальный тест для страницы Home.

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

match '/', to: 'static_pages#home', via: 'get'

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

SampleApp::Application.routes.draw do
  .
  .
  .
  # You can have the root of your site routed with "root"
  # root 'welcome#index'
  .
  .
  .
end
Листинг 5.25. Закомментированная подсказка для определения root маршрута. config/routes.rb

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

SampleApp::Application.routes.draw do
  root  'static_pages#home'
  match '/help',    to: 'static_pages#help',    via: 'get'
  match '/about',   to: 'static_pages#about',   via: 'get'
  match '/contact', to: 'static_pages#contact', via: 'get'
  .
  .
  .
end
Листинг 5.26. Добавление соответствия для root маршрута. config/routes.rb

Этот код направляет корневой URL / к /static_pages/home, а это означает что http://localhost:3000/ наконец то покажет нечто иное нежели дефолтную Rails страницу из Этот код направляет корневой URL / к /static_pages/home, а это означает что http://localhost:3000/ наконец то покажет нечто иное нежели дефолтную Rails страницу из рис. 1.3. Он также дает нам следующие URL хелперы:. Он также дает нам следующие URL хелперы:

root_path -> '/'
root_url  -> 'http://localhost:3000/'

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

$ bundle exec rspec spec/requests/static_pages_spec.rb

Теперь нам осталось просто заполнить ссылки в макете.

Именованные маршруты

Давайте применим именованные маршруты, созданные в Разделе 5.3.2. Это повлечет за собой заполнение второго аргумента link_to функции правильным именованным маршрутом. Например, мы конвертируем

<%= link_to "About", '#' %>

в

<%= link_to "About", about_path %>

и так далее.

Мы начнем с партиала _header.html.erb (Листинг 5.27), который содержит ссылки на Home и Help страницы. Пока мы здесь, мы также, следуя общей конвенции Сети, свяжем логотип с Home страницей.

<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="navbar-inner">
    <div class="container">
      <%= link_to "sample app", root_path, id: "logo" %>
      <nav>
        <ul class="nav pull-right">
          <li><%= link_to "Home",    root_path %></li>
          <li><%= link_to "Help",    help_path %></li>
          <li><%= link_to "Sign in", '#' %></li>
        </ul>
      </nav>
    </div>
  </div>
</header>
Листинг 5.27. Партиал _header со ссылками. app/views/layouts/_header.html.erb

У нас не будет именованного маршрута для "Sign in" ссылки, до Главы 8, поэтому мы пока оставили ее в виде ’#’.

Другим местом со ссылками является партиал подвала, _footer.html.erb, в котором есть ссылки для About и Contact страниц (Листинг 5.28).

<footer class="footer">
  <small>
    <a href="http://railstutorial.org/">Rails Tutorial</a>
    by Michael Hartl
  </small>
  <nav>
    <ul>
      <li><%= link_to "About",   about_path %></li>
      <li><%= link_to "Contact", contact_path %></li>
      <li><a href="http://news.railstutorial.org/">News</a></li>
    </ul>
  </nav>
</footer>
Листинг 5.28. Партиал _footer со ссылками. app/views/layouts/_footer.html.erb

Теперь наш макет имеет ссылки на все статические страницы созданные в Главе 3, так, например, /about ведет к About странице ( рис. 5.8).

Кстати, стоит отметить, что мы на самом деле не протестировали на наличие ссылок в шаблоне, наши тесты будут провальными, только если маршруты не определены. Вы можете проверить это, закомментировав один из маршрутов в Листинге 5.24 и запустив ваш набор тестов. Метод тестирования который на самом деле обеспечивает уверенность что ссылки существуют и отправляют в правильные места, см. в Разделе 5.6.

About страница на /about.

Рис. 5.8. About страница на /about.
Вадим Обозин
Вадим Обозин

Здравствуйте, записался на курс. При этом ставил галочку на "обучаться с тьютором". На email пришло письмо, о том, что записался на самостоятельное изучение курса. Как выбрать тьютора?