Мультиблог на Ruby on Rails. Страница отдельного поста и пагинация. Урок 10.
Мы реализовали многое, но у нас всё ещё нет страницы для детального отображения статьи и нет пагинации на страничке со списком всех статей. Пришло время исправить это.
Создание страницы детального отображения статьи
Маршрут нам прописывать не надо, поскольку мы уже используем конструкцию resource. Контролер тоже выглядит просто, так как объект типа Post мы уже получили - напомню, за это отвечает конструкция before_action. А значит в методе show вообще ничего не будет:
def show end
Всем понятно, почему так получилось? Если нет, то на всякий случай напомню. В переменную @post мы получаем объект типа Post; это происходит в функции set_post, которая выполняется в том числе и для action show. Ну а дальше сама переменная попадает в шаблон (view), путь к файлу которого определяется по названию контролера и экшена. В данном случае, это файл app/views/posts/show.html.erb Ну и соответственно во view "парсим" саму переменную:
<% content_for :h1 do %> <%= @post.title %> <% end %> <% content_for :title do %> <%= @post.title %> <% end %> <%= @post.body %>
Теперь осталось вывести ссылку на страничку детального поста. Тут всё просто: отредактируем файл _post.html.erb и в том месте, где должна выводиться ссылка, просто используем соответствующий хэлпер url_for:
<a href="<%= url_for(post) %>">
Пагинация
В качестве решения для пагинации мы будем использовать популярное расширение kaminari; но сперва давайте отсортируем статьи так, чтобы новые записи отображались первыми:
def index @posts = Post.order(created_at: :desc) end
Далее нам нужно установить непосредственно сам гем - для этого пропишем данное расширение в Gemfile:
gem 'kaminari'
И в консоли запустим команду:
bundle i
которая собственно и произведёт инсталяцию приложения.
Теперь, чтобы сконфигурировать приложение, скопируем файл конфигурации из этого пакета к нам в приложение, с помощью команды:
rails g kaminari:config
При этом будет создан файл config/initializers/kaminari_config.rb, в котором среди прочих настроек, можно указать, сколько постов необходимо отображать на текущей странице. Я не знаю сколько постов успели создать вы, но поскольку у меня их получилось около 10, то я раскоментировал эту строчку и установил нужное мне значение:
config.default_per_page = 5
После чего останется модифицировать метод index:
def index @posts = Post.order(created_at: :desc).page params[:page] end
А уже в самом шаблоне view, в том месте, где должна отображаться пагинация, необходимо прописать:
<%= paginate @posts %>
Однако, если обновить страницу, то можно обнаружить, что пагинация выглядит не так красиво, как в нашем исходном шаблоне. Как это можно исправить? Очень просто. Поскольку наш шаблон использует фреймворк bootstrap 4, то мы можем в консоли сформировать все необходимые шаблоны именно для этого фреймворка:
rails generate kaminari:views bootstrap4
Вот теперь стало красиво. Как и всегда, изменения в репозитории - https://github.com/maclen2007/simple_ruby_blog/commit/c85a14b8802daa446a2c8d38fa7be45f30651245