これは何?
Rails5.2から利用可能になったActive Storageについて記載します。
これまではRails TutorialではCarrierwaveを使ったり、Paperclipを使ったりと正式なものがなかったですが、 Rails単体で記述ができるようになりました。
クラウドストレージはS3やGCSがメインで使われることが多いと思ってますが、それらとの連携も非常に楽なようです。
セットアップ
Active Storageを使うためには、二つのテーブルを用意する必要があります。それをまずは作ります。
bundle exec rails active_storage:install
bundle exec rails db:migrate
僕の場合はMySQLを使っているので下記のように見えてます。
また、ストレージを環境によって分岐させたいため、configの中身を触ります。
#Test環境
test:
service: Disk #ディスク上に保存します。
root: <%= Rails.root.join("tmp/storage") %>
# Development環境
local:
service: Disk #ディスク上に保存します。
root: <%= Rails.root.join("storage") %>
# Production環境
# コメントアウトされてるS3やGCSの設定に合わせてください。
=> 保存先の設定
storage_type = Rails.application.config.active_storage.service
if Rails.env == "production"
# storage_type =
elsif Rails.env == "development"
storage_type = :local
else
storage_type = :test
end
=> 環境ごとの分岐設定
サンプルコード
では今回は、簡単なユーザーモデルを作成して、ActiveStorageでアバターを登録できるようにしようと思います。
bundle exec rails g model User name:string
bundle exec rails db:migrate
bundle exec rails g controller Users index new
=> avatar用のカラムを用意しなくていいのがポイントです。
resources 'users'
has_one_attached :avatar
=> モデルクラスにて、has_one_attached
メソッドを定義する
def index
@users = User.all
end
def create
user = User.new(user_params)
user.save
redirect_to users_path
end
def new
@user = User.new
end
private
def user_params
params.require(:user).permit(:name, :avatar)
end
=> :avatar
をパラメータで許可する
<% @users.each do |user| %>
<%= user.name %>
<%= image_tag(user.avatar) if user.avatar.attached? %>
<% end %>
=> image_tag(user.avatar)
でシンプルに呼び出し可能
<%= form_with model:@user do |f| %>
<div>
<%= f.label :name %>
<%= f.text_field :name %>
</div>
<div>
<%= f.label :avatar %>
<%= f.file_field :avatar %>
</div>
<div>
<%= f.submit '登録' %>
</div>
<% end %>
これで登録したユーザー名とアバターが一覧で見えるページができると思います。
一体どうなってるのか
usersテーブルには当然avatarカラムは存在していないが、
active_storage_attachments
にrecord_id
というusersテーブルと紐づくカラムが存在している。
また、実際の写真の情報に関してはactive_storage_blobs
に保管されている。
key
カラムがファイル名となってstorage
配下に保存されているのが確認できると思います。
まとめ
非常に使いやすくなってるので、誰も簡単に使うことができると思います。