ActiveStorageによるファイルアップロード
-
実装
-
ActiveStorageの有効化
- 以下を実行
rails active_storage:install
-
ActiveStorage用属性をモデル作成時に宣言する
rails g scaffold user name portrait:attachment
-
portrait:attachment
部分がActiveStorage用属性の宣言 - 生成されたモデルには以下の記述が追加されている
class User < ApplicationRecord has_one_attached :portrait # 追加部分 end
-
注意として、Usersテーブルにportraitはカラムとしては無く、他のテーブルとして管理されている。
-
これでファイルアップロード機能は実現している
-
-
サムネイルの表示
- 事前準備
-
gem 'image_processing'
をアンコメントし、bundle install
-
brew install imagemagick
を実行
-
- ActiveStorageのサムネイル生成は、画像用URLにアクセスしたタイミングで画像を生成する。他にもアップロード時、アップロード後に非同期、などのタイミングで生成するサービスもある。
- 先ほど実装したファイル(app/views/users/show.html.erb)を編集する
<%= image_tag @user.portrait.variant(resize_to_limit: [100, 100]) %>
- 事前準備
-
ダイレクトアップロード機能
-
ダイレクトアップロードにより、アプリケーションサーバを経由せずにファイルを直接アップロードできるので、アップロード時間の短縮や、アプリケーションサーバへの負荷を軽減することが可能になる。
-
実装
<%= form.file_field :portrait, direct_upload: true %>
-
direct_uploda: true
を追加することでダイレクトアップロードが可能になる。 - 詳しくは以下
- https://railsguides.jp/active_storage_overview.html#ダイレクトアップロード
-
-
-
ActiveStorageのデメリット
- バリデーションヘルパーが無い
- フォーム送信時、他の項目がバリデーションエラーになった時、再度ファイルを選択しなければならない