💎

[Rails]Shrine(gem)で異なるモデル間のファイルコピーをする方法(remote_url)

2022/09/10に公開

Srhineとは?

Srhineとは、Ruby Webアプリケーション(Ruby on Rails等)でファイルを取り扱う時に使用する、ライブラリです。

異なるモデル間でファイルをコピーする方法の1つとして、「ファイルをダウンロードしてから、再度アップロードし直す」方法があります。

上記の方法の中でも、色々な実装方法があります。

  • コピーするURLを指定して、HTTP経由でダウンロード&アップロードをする方法
  • Attacherを使ってコピーする方法
  • remote_urlを使ってコピーする方法

この記事では、remote_urlを使ったコピー方法を、下記の3つのステップに分けて解説していきます。

目次

  • 事前準備
  • ファイルのURLを取得する
  • ファイルをアップロードする

事前準備

remote_url の方法を使うには、uploader に remote_url を使う宣言をする必要があります。

Uploaderクラスを作成し、下記のようにpluginを読み込ませてください。

class ApplicationUploader < Shrine
  plugin :remote_url, max_size: 20*1024*1024
end

ファイルのURLを取得する

アップロードしたファイルのURLを取得します。
S3を使っている場合は、public readで設定しておく必要があります。

url = record.image.present? ? record.image.url : nil

ファイルをアップロードする方法

ファイルをアップロードするには、<カラム名>_remote_urlにセッターが用意されています。このセッターに代入します。

duplication.image_remote_url = url

このままsaveすると、ダウンロードとアップロードが同時に実行されます。

Discussion