LoginSignup
7
7

More than 5 years have passed since last update.

Active Storageについて

Posted at

これは何?

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配下に保存されているのが確認できると思います。

まとめ

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

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7