Rails 5.2から、Active Storageという、ファイルアップロードの機能が標準装備されましたが、そのまま使おうとしたところ、微妙に気になる点がありました。
Active Storageの便利な点
今までPaperclipなどのサードパーティーのGemを使っていたのですが、以下のような点を自前で実装する必要がありました。
- S3でprivate保管していると、画像表示用に生成したpresigned URLが期限切れするという問題があるので、いったんRailsを経由させてS3のURLにリダイレクトさせる必要がある
- オンデマンドに適切なサイズのサムネイルを生成するのが難しい
Active Storageであれば、こういった引っかかりやすい箇所も標準で備えていて、しかも「複数オリジンの並行運用」なんてことまでこなせてしまいます。
使い方について
Active Storageは専用のデータベーステーブルを持って、ポリモーフィック関連で別なモデルと結びつきますので、画像を入れたいモデル側でのマイグレーションは不要です。has_one_attached :item
やhas_many_attached :items
のように宣言するだけで画像を使えるようになります。
そのまま使おうとして気になったこと
もちろんそのままでも基本的なファイル保存などは問題ないのですが、使いづらい点がいくつかありました。
- モデルが
ActiveStorage::Attachment
で固定なので、- 自分でメソッドを生やそうにもオープンクラスになってしまい、抵抗がある
- 画像ファイルに付随するタイトルなどのデータを保存できない
-
has_many_attached
の場合、accepts_nested_attributes_for
でファイルの追加はできるけど削除が利かない
画像用モデルを立てる
ということで、画像と1対1で結びつくモデルを立てて、そこにタイトルを入れたり、画像処理用のメソッドを追加したりすることでより便利に使えて、そしてaccepts_nested_attributes_for
からの_destroy
もできるようになるので、この方法が良さそうだと感じました。