Как создать статическую страницу в Ruby on Rails?

Для создания статической страницы в RoR достаточно лишь поместить *.html страницу в директорию /public. После этого мы сможем получить доступ к ней по ссылке https://localhost:3000/your_page_name.html.

Этот путь довольно прост, но имеет в себе все недостатки статического html-документа. Чтобы быть более гибкими в разработке и поддержке информационных статических страниц (например 'О проекте', 'Контакты') мы будем использовать Rails-way решение.

Создадим контроллер для информационных страниц и добавим первую - about:

rails g controller InfoPages about

Этот генератор создаст для нас все необходимые файлы:

Running via Spring preloader in process 25659
      create  app/controllers/info_pages_controller.rb
       route  get 'info_pages/about'
      invoke  erb
      create    app/views/info_pages
      create    app/views/info_pages/about.html.erb
      invoke  test_unit
      create    test/controllers/info_pages_controller_test.rb
      invoke  helper
      create    app/helpers/info_pages_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/info_pages.scss

Если попробовать открыть страницу http://localhost:3000/about мы получим ошибку:

Routing Error


No route matches [GET] "/about"

Данная ошибка говорит о том, что с нашими путями что-то не так. Посмотрим на то, что генератор добавил в наши пути:

"rails g controller info_pages about"

Добавленный путь генерирует страницу about после имени контроллера. Убедимся в этом запустив rake routes в терминале:

Prefix Verb           | URI Pattern                  | Controller#Action

info_pages_about GET  | /info_pages/about(.:format)  |  info_pages#about

Это означает, что перейдя по ссылке http://localhost:3000/info_pages/about мы увидим содержимое контроллера info_pages и его экшена about.

Генератор для нас подготовил views/info_pages/about.html.erb с следующим содержимым:

<h1>InfoPages#about</h1>
<p>Find me in app/views/info_pages/about.html.erb</p>

На этом вся работа по созданию статической страницы на Ruby on Rails заканчивается. Остается лишь добавить нужный контент на страницу. Но также хотелось бы сделать ссылку более презентабельной (убрать имя контроллера и оставить только /about).

Это можно сделать модифицировав путь в config/routes.rb:

get 'info_pages/about' # эту строку удаляем
get '/about', to: 'info_pages#about' # а эту добавляем

Запустим rake routes:

Prefix Verb           | URI Pattern                  | Controller#Action

info_pages_about GET  | /about(.:format)             |  info_pages#about

Теперь info_pages#about доступен по новой ссылке http://localhost:3000/about. Отметим, что страница взаимодействует с layout, который установлен по умолчанию (обычно application.rb).

Эта заметка написана для Ruby on Rails 6. Обратите внимание, что написание некоторых вещей может отличаться в других версиях RoR.