Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Статические страницы Основы разработки на Ruby on Rails

Программа урока

  • Как ресурсный стиль помогает реализовывать роуты без дублирования кода?
  • Как создавать и работать с контроллерами в Rails? Какие есть опции для генератора контроллеров?
  • Как создавать и рендерить макеты?
  • Как избегать дублирования макетов?
  • Работа с Шаблонами и паршаллами, роут-хелперами,рРесурсным роутингом

Генерация контроллера

Создание контроллера с экшеном.

bin/rails g controller pages index
bin/rails g controller pages index
Running via Spring preloader in process 82534
      create  app/controllers/pages_controller.rb
       route  get 'pages/index'
      invoke  erb
      create    app/views/pages
      create    app/views/pages/index.html.erb
      invoke  test_unit
      create    test/controllers/pages_controller_test.rb
      invoke  helper
      create    app/helpers/pages_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/pages.scss

Отмена изменений генератора

bin/rails d controller pages index

При выполнении генератора будет добавлен роут в config/routes.rb

Rails.application.routes.draw do
  get 'pages/index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end

Создание котроллера с экшеном без создания роута в config/routes.rb bin/rails g controller pages index --skip-routes

Показать список роутов bin/rails routes

Показать только те, что содержат pages bin/rails routes -g pages

# config/routes.rb
Rails.application.routes.draw do
  root 'pages#index'
  # get 'pages/about', to: 'pages#about'
  # get 'pages/term_of_service', to: 'pages#term_of_service'
  # page_path   GET /pages/:id(.:format) pages#show
  # ресурсный роутинг позволяет создавать роуты динамически
  resources :pages, only: :show
end

Контроллеры

Все контроллеры приложения Rails наследуются от контроллера, который наследуется от базового

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
end

# app/controllers/pages_controller.rb
class PagesController < ApplicationController
end

Вызов root 'pages#index' позволяет добавить корневую страницу, которая будет обрабатываться контроллером PagesController методом index()

# app/controllers/pages_controller.rb
class PagesController < ApplicationController
def index; end
end

Шаблонизатор ERB

<% #Пример комментария в erb %>
Знак = используется для отображения значений
params содержит переменные из пути, например /pages/:id - /pages/about
<%= params[:id] %>

<% 10.times do %>
Для конструкций знак = не используется.
<% end %>

Хелперы

Предположим есть шаблон и в нём выводятся ссылки

<h1>Pages catalog</h1>
<p>Find me in app/views/pages/index.html.erb</p>

<p><a href="/pages/about">About</a></p>
<p><a href="/pages/term_of_service">Term of service</a></p>

Используется хелпер link_to для формирования ссылок

<p><%= link_to "About", 'pages/about' %></p>
<p><%= link_to "Term of service", '/pages/term_of_service' %></p>

Rails создаёт для роутов хелперы для каждого урла, в их можно передать какие-либо параметры. Посмотреть созданные хелперы можно через bin/rails routes и на странице с неверным роутом

<p><%= link_to "About", page_path(:about) %></p>
<p><%= link_to "Term of service", page_path(:term_of_service) %></p>

Для получения ссылки на корневую страницу создается хелпер root_path. Список хелперов можно посмотреть в списке роутов

Шаблоны и Вью

Rails позволяет использовать базовый шаблон и отображать уникальный контент. Контент страницы будет выведен с помощью yield. Шаблоны находятся в директории app/views/layouts.

Пример базового шаблона app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title>ExampleApp</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

Страница app/views/pages/index.html.erb Содержит только уникальный контент

<h1>Pages catalog</h1>
<p>Find me in app/views/pages/index.html.erb</p>

<p><%= link_to "About", page_path(:about) %></p>
<p><%= link_to "Term of service", page_path(:term_of_service) %></p>

Контроллеры и Вью

По соглашению Rails будет искать шаблоны по имени контроллера и метода. Так для метода index() путь для вью будет app/views/pages/index.html.erb. В теле метода не нужно вручную указывать Вью.

class PagesController < ApplicationController
  def index; end
end
<% # app/views/pages/index.html.erb >
<h1>Pages catalog</h1>
<p>Find me in app/views/pages/index.html.erb</p>

<p><%= link_to "About", page_path(:about) %></p>
<p><%= link_to "Term of service", page_path(:term_of_service) %></p>

Рендер других шаблонов

Рендер другого шаблона ./_about.html.erb

<%= render 'about' >

render partial требует четкого указания пути и локальной передачи переменных. Обычный render использует переменные в том контексте запроса, в котором вызывается

<%= render partial: "pages/partial/links", locals: {} %>

Сам файл находится по следующиму пути — app/views/pages/partial/_links.html.erb

<p><%= link_to "Back", root_path %></p>

Рендеринг статичных страниц

Вместо создания методов для каждой конкретной страницы можно использовать один метод. Вместо:

class PagesController < ApplicationController
  def about; end
  def term_of_service; end

  def index; end
end

Используем метод show()

class PagesController < ApplicationController
  def show; end

  def index; end
end

Чтобы в будущем воспользоваться хелпером и удобно работать с урлами, используем ресурсный роутинг (подробнее о нём в следующих уроках):

Rails.application.routes.draw do
  root 'pages#index'
  # page_path   GET /pages/:id(.:format) pages#show
  resources :pages, only: :show
end

Ресурсный роутинг позволяет создавать роуты динамически. Имя страницы будет передаваться в параметрах путей. Например example.com/pages/tos, где tos — будет параметром ID страницы. У статических страниц будет загружаться вью app/views/pages/show.html.erb

<%= render params[:id] %>

А уникальный для каждой страницы контент находиться в своем шаблоне. Имя шаблона будет начинаться с нижнего подчёркивания

  • app/views/pages/_about.html.erb
  • app/views/pages/_tos.html.erb

Домашнее задание

Загрузите домашнее задание с помощью команды:

hexlet program download rails static-pages

Дополнительные материалы

  1. Официальный гайд по Ruby On Rails — Layouts and Rendering in Rails

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу