Active Storageについて


これは何?

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を使っているので下記のように見えてます。

image.png

また、ストレージを環境によって分岐させたいため、configの中身を触ります。


config/storage.yml

#Test環境

test:
service: Disk #ディスク上に保存します。
root: <%= Rails.root.join("tmp/storage") %>

# Development環境
local:
service: Disk #ディスク上に保存します。
root: <%= Rails.root.join("storage") %>

# Production環境
# コメントアウトされてるS3やGCSの設定に合わせてください。


=> 保存先の設定


config/initializers/storage.rb

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用のカラムを用意しなくていいのがポイントです。


routes.rb

resources 'users'



models/user.rb

has_one_attached :avatar


=> モデルクラスにて、has_one_attachedメソッドを定義する


users_controller.rb

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/index.html.erb

<% @users.each do |user| %>

<%= user.name %>
<%= image_tag(user.avatar) if user.avatar.attached? %>
<% end %>

=> image_tag(user.avatar)でシンプルに呼び出し可能


users/new.html.erb

<%= 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 %>

これで登録したユーザー名とアバターが一覧で見えるページができると思います。


一体どうなってるのか

登録した後のDBを覗いてみる。(3つサンプルを登録した)

image.png

usersテーブルには当然avatarカラムは存在していないが、

active_storage_attachmentsrecord_idというusersテーブルと紐づくカラムが存在している。

また、実際の写真の情報に関してはactive_storage_blobsに保管されている。

keyカラムがファイル名となってstorage配下に保存されているのが確認できると思います。


まとめ

非常に使いやすくなってるので、誰も簡単に使うことができると思います。