Первым делом:
rails active_storage:install
rails db:migrate
Далее:
# config/environments/production.rb
config.active_storage.service = :amazon
Для среды разработки оставляем:
config.active_storage.service = :local
ну или как захочется.
Добавляем в Gemfile и бундлим:
gem 'aws-sdk-s3'
Добавляем в модель:
class Post < ApplicationRecord
-------
has_one_attached :image
-------
, либо, если нужна возможность добавлять к статье несколько изображений, а не одно:
has_many_attached :images
Теперь в app/admin/posts.rb добавляем одну-единственную новую строчку:
f.input :image, as: :file
# f.input :images, as: :file, input_html: { multiple: true }
, и там же обновляем permit_params:
permit_params :title, :text, :tag_list, :image
# permit_params :title, :text, :tag_list, images: []
Далее в Amazon S3 создаем корзину, bucket settings => "Block all public access", далее "My Security Credentials" и добавляем IAM-юзера, чекбоксы "Programmatic access" и "AWS Management Console access" отмечены. "Attach existing policies directly" => выбираем "AmazonS3FullAccess". Копируем "Access key ID" и "Secret access key", также понадобятся имя корзины и регион. Все, консоль AWS на этом можно закрыть.
Для записи environment variables (переменные среды) я использовал в данном проекте figaro, соответственно - добавил в application.yml (и в консоль Heroku, Reveal Config Vars) две строчки, значения которых у вас теперь тоже есть:
AWS_ACCESS_KEY_ID: '*********************'
AWS_SECRET_ACCESS_KEY: '****************************'
Осталось только раскомментировать amazon:
# config/storage.yml
amazon:
service: S3
access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
region: us-east-2
bucket: masterpro
...и все уже должно работать.