LoginSignup
0
2

More than 3 years have passed since last update.

Active Storageにも、1対1対応のモデルを作ったほうがいいかも

Posted at

Rails 5.2から、Active Storageという、ファイルアップロードの機能が標準装備されましたが、そのまま使おうとしたところ、微妙に気になる点がありました。

Active Storageの便利な点

今までPaperclipなどのサードパーティーのGemを使っていたのですが、以下のような点を自前で実装する必要がありました。

  • S3でprivate保管していると、画像表示用に生成したpresigned URLが期限切れするという問題があるので、いったんRailsを経由させてS3のURLにリダイレクトさせる必要がある
  • オンデマンドに適切なサイズのサムネイルを生成するのが難しい

Active Storageであれば、こういった引っかかりやすい箇所も標準で備えていて、しかも「複数オリジンの並行運用」なんてことまでこなせてしまいます。

使い方について

Active Storageは専用のデータベーステーブルを持って、ポリモーフィック関連で別なモデルと結びつきますので、画像を入れたいモデル側でのマイグレーションは不要です。has_one_attached :itemhas_many_attached :itemsのように宣言するだけで画像を使えるようになります。

そのまま使おうとして気になったこと

もちろんそのままでも基本的なファイル保存などは問題ないのですが、使いづらい点がいくつかありました。

  • モデルがActiveStorage::Attachmentで固定なので、
    • 自分でメソッドを生やそうにもオープンクラスになってしまい、抵抗がある
    • 画像ファイルに付随するタイトルなどのデータを保存できない
  • has_many_attachedの場合、accepts_nested_attributes_forでファイルの追加はできるけど削除が利かない

画像用モデルを立てる

ということで、画像と1対1で結びつくモデルを立てて、そこにタイトルを入れたり、画像処理用のメソッドを追加したりすることでより便利に使えて、そしてaccepts_nested_attributes_forからの_destroyもできるようになるので、この方法が良さそうだと感じました。

0
2
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
0
2