Мультиблог на Ruby on Rails. Работа с изображениями. Урок 11.
Чтобы наш блог выглядел более живым и красочным, давайте добавим возможность прикреплять к каждой статье блога свою картинку. Для работы с изображением в Ruby есть библиотека carrierwave, поэтому давайте добавим её в Gemfile:
gem 'carrierwave'
и произведём установку через команду bundle i
Далее создадим загрузчик изображения:
rails g uploader Image
В результате этого действия будет создан загрузчик по адресу /app/uploaders/image_uploader.rb
Дальше добавляем инициализацию этого аплоадера в модель Post:
mount_uploader :image, ImageUploader
Теперь нужно создать поле для загрузки изображения в самой форме:
<div class="form-group"> <%= form.file_field :image %> </div>
И не забываем добавить поле image в список разрешённых, для создания объекта из полей формы. Делается это напомню, в функции post_params, о предназначении которой я рассказывал в уроке по "Созданию новой статьи пользователем" (кстати, обратите внимание, что поле image у нас уже было создано ещё при проектировании самой таблички с постами; в противном случае необходимо было бы создать миграцию на его добавление).
params.require(:post).permit(:title, :body, :image)
Собственно теперь можно отредактировать запись и попробовать добавить картинку. Чтобы убедиться в том, загрузилось ли изображение или нет, достаточно проверить папку public/uploads на наличие вашей картинки.
Вывод картинки в шаблоне View
В принципе, нам уже сейчас ничего не стоит, в файле show.html.erb чуть выше body, вывести картинку вот так:
<%= image_tag @post.image.url, style: 'width: 100%' %>
Однако у нас в шаблоне, место под картинку отведено в шапке и мы, ещё на этапе создания базового шаблона, уже обозначили для неё секцию image. И теперь всё, что остаётся, это перезаписать её в самом файле show.html.erb:
<% content_for :image do %><%= @post.image.url %><% end %>
Здесь мы хэлпер image_tag уже не используем, так как картинка выводится через CSS свойство.
Вот таким нехитрым образом мы реализовали добавление картинки. Изменения данного урока, как и всегда, в коммите.