Recordモデルにファイルを添付する方法について説明します。このガイドを読むと下記の内容が理解できるでしょう。1つまたは複数のファイルを1つのレコードに添付する方法。Recordオブジェクトにアタッチする機能を提供します。development環境とtest環境向けのローカルディスクベースのサービスを利用できるようになっており、ファイルを下位のサービスにミラーリングしてバックアップや移行に用いることもできます。PDFやビデオなどの非画像アップロードの画像表現を生成したり、任意のファイルからメタデータを抽出したりできます。active_storage_blobsとactive_storage_attachmentsという名前の2つのテーブルを使用します。active_storage:installを実行して、これらのテーブルを作成するmigrationファイルを作成します。db:migrateをお使いください。active_storage_attachmentsは、使うモデルのクラス名を保存するポリモーフィックjoinテーブルです。モデルのクラス名を変更した場合は、このテーブルに対してマイグレーションを実行して背後のrecord_typeをモデルの新しいクラス名に更新する必要があります。Storageのサービスはconfig/storage.ymlで宣言します。アプリケーションが使うサービスごとに、名前と必要な構成を指定します。次の例では、local、test、amazonという3つのサービスを宣言しています。Storageに認識させるには、Rails.application.config.active_storage.serviceを設定します。使うサービスは環境ごとに異なることもあるため、この設定を環境ごとに行うことをおすすめします。前述したローカルDiskサービスをdevelopment環境で使うには、config/environments/development.rbに以下を追加します。S3を利用するには、config/environments/production.rbに以下を追加します。:amazon内蔵されているサービスアダプタ(DiskやS3など)およびそれらに必要な設定について、詳しくは後述します。DiskサービスDiskサービスはconfig/storage.ymlで宣言します。S3サービスS3サービスはconfig/storage.ymlで宣言します。Storageのコア機能では、s3:ListBucket、s3:PutObject、s3:GetObject、s3:DeleteObjectという4つのパーミッションが必要です。ACLの設定といったアップロードオプションを追加で設定した場合は、この他にもパーミッションが必要になることがあります。環境変数、標準SDKの設定ファイル、プロファイル、IAMインスタンスのプロファイルやタスクロールを使いたい場合は、上述のaccess_key_id、secret_access_key、regionを省略できます。documentationに記載されている認証オプションをすべてサポートします。Storageサービスはconfig/storage.ymlで宣言します。Storageクライアントのgemを追加します。Storageサービスはconfig/storage.ymlで宣言します。""keyfileパスの代わりに、credentialのハッシュを渡すこともできます。Storageクライアントのgemを追加します。ミラーサービスミラーサービスを定義すると、複数のサービスを同期できます。ファイルのアップロードや削除は、ミラー化されたすべてのサービスに渡って行われます。ミラーリングされたサービスを用いることで、production環境内のサービス間の移行も行えます。新しいサービスへのミラーリングを開始したり、既存のファイルを古いサービスから新しいサービスにコピーしたり、新しいサービスに完全に切り替えたりできます。利用したいサービスごとに上と同じ要領で定義し、ミラー化されたサービスから参照します。s3_west_coastファイルはprimaryサービスから提供されます。この機能はダイレクトアップロード機能との互換性がありません。has_one_attachedhas_one_attachedマクロは、レコードとファイルの間に1対1のマッピングを設定します。各レコードには1つのファイルを添付できます。アプリケーションにUserモデルがあるとします。各userにavatarを持たせたい場合は、以下のようにUserモデルを定義します。:avatarend以下のように書くことでavatar付きのuserを作成できます。endend既存のuserにavatarを添付するにはavatar.attachを呼び出します。Current.user.avatar.attach(params[:avatar])avatar.attached?で特定のuserがavatarを持っているかどうかを調べられます。has_many_attachedhas_many_attachedマクロは、レコードとファイルの間に1対多の関係を設定します。各レコードには、多数の添付ファイルをアタッチできます。アプリケーションにMessageモデルがあるとします。:imagesend以下のように書くことで、画像付きのメッセージを作成できます。endendimages.attachを呼び出すと、既存のメッセージに新しい画像を追加できます。@message.images.attach(params[:images])あるメッセージに何らかの画像がアタッチされているかどうかを調べるには、image.attached?を呼び出します。ObjectsをアタッチするHTTPリクエスト経由では配信されないファイルをアタッチする必要が生じる場合があります。ディスク上で生成したファイルやユーザーが送信したURLからダウンロードしたファイルをアタッチしたい場合や、モデルのテストでfixtureファイルをアタッチしたい場合などが考えられます。これを行うには、オープンIOオブジェクトとファイル名を1つ以上含むハッシュを渡します。'file.pdf')可能であれば、content_type:も指定しましょう。Storageは、渡されたデータからファイルのcontent_typeの判定を試みますが、判定できない場合はcontent_typeにフォールバックします。Storageがファイルのcontent_typeを自動的に判別できない場合は、デフォルトでapplication/octet-streamが設定されます。purgeを呼び出します。Jobを使用するようにアプリケーションが設定されている場合は、バックグラウンドで削除を実行できます。消去すると、BLOBとファイルがストレージサービスから削除されます。avatarと実際のリソースファイルを同期的に破棄します。Jobを介して、関連付けられているモデルと実際のリソースファイルを非同期で破棄します。ファイルにリンクするアプリケーションを指すblobのパーマネントURLを生成します。アクセス時には、実際のサービスエンドポイントへのリダイレクトが返されます。このインダイレクションによってパブリックURLを実際のURLと切り離し、たとえば、高可用性のために添付ファイルを別サービスにミラーリングすることもできます。リダイレクトのHTTPの有効期限は5分です。url}ヘルパーを使います。このヘルパーでdisposition:を設定できます。"attachment")コントローラやビューのコンテキストの外(バックグラウンドジョブやcronジョブなど)からリンクを作成したい場合、rails_blob_pathを用いて以下のようにアクセスできます。ファイルをダウンロードするアップロードしたblobに対して処理を行う(別フォーマットへの変換など)必要が生じることがあります。ActiveStorage::Blob#downloadを用いてblobのバイナリデータをメモリに読み込めます。user.avatar.download場合によっては、blobをディスク上のファイルとしてダウンロードし、外部プログラム(ウイルススキャナーやメディアコンバーターなど)で処理できるようにしたいことがあります。ActiveStorage::Blob#openでblobをディスク上のtempfileにダウンロードできます。画像を変換する画像のバリエーションを作成するには、Blobでvariantを呼び出します。このメソッドには、画像プロセッサでサポートされる任意の変換方法を渡せます。デフォルトの画像プロセッサはMiniMagickですが、Vipsも使えます。gemをGemfileに追加します。Storageは元のblobを指定のフォーマットに遅延変換し、新しいサービスのロケーションにリダイレクトします。%>画像プロセッサをVipsに切り替えるには、config/application.rbに以下を追加します。画像でないファイルの中にはプレビューできるものもあります(画像として表示されます)。動画ファイルの最初のフレームを抽出してプレビューできます。Storageでは、動画とPDFドキュメントについてすぐ使えるプレビュー機能をサポートしています。%></ul>プレビュー画像の抽出にはサードパーティのアプリケーションが必要です(動画の場合はffmpeg、PDFの場合はmutool)。これらのライブラリはRailsでは提供されていません。組み込みのプレビューソフトウェアを使う場合は、自分でインストールしなければなりません。サードパーティのソフトウェアをインストールして使う場合、そのソフトウェアがライセンスにどのように影響をするかを理解しておいてください。Storageは、付属のJavaScriptライブラリを用いて、クライアントからクラウドへのダイレクトアップロードをサポートします。ダイレクトアップロードのインストールアプリケーションのJavaScriptバンドルにactivestorage.jsを追記します。アセットパイプラインを使う場合は以下のようにします。activestoragenpmパッケージを使う場合は以下のようにします。"activestorage"ActiveStorage.start()ファイル入力に以下を記述してダイレクトアップロードのURLを指定します。アップロードはフォーム送信時に開始されます。ダイレクトアップロードフィールドのファイルを含むフォームが送信された。フォーム送信後のすべてのファイルにディスパッチされる。直接アップロードが開始されている。アプリケーションにダイレクトアップロードメタデータを要求する前。ファイルを保存するリクエストを出す前。ファイルを保存する要求が進行中。このイベントがキャンセルされない限り、alertが表示される。ダイレクトアップロードが終了した。すべてのダイレクトアップロードが終了した。上記のイベントを用いて、アップロードの進行状況をプログレスバー表示できます。以下は、アップロードされたファイルをフォームに表示するコードです。element.classList.add("direct-upload--complete")})以下のスタイルを追加します。ライブラリやフレームワークとの統合ダイレクトアップロード機能をJavaScriptフレームワークから利用したい場合や、ドラッグアンドドロップをカスタマイズしたい場合は、DirectUploadクラスを利用して行えます。選択したライブラリからファイルを1件受信したら、DirectUploadをインスタンス化してそのインスタンスのcreateメソッドを呼び出します。createには、アップロード完了時に呼び出すコールバックを1つ渡せます。})}ファイルアップロードの進行状況をトラッキングする必要がある場合は、DirectUploadコンストラクタに3番目のパラメータを渡せます。DirectUploadはアップロード中にオブジェクトのdirectUploadWillStoreFileWithXHRメソッドを呼び出すので、以後XHRの独自のプログレスハンドラをバインドできるようになります。システムテスト中に保存したファイルを破棄するシステムテストでは、トランザクションをロールバックすることでテストデータをクリーンアップしますが、destroyはオブジェクトに対して呼び出されないため、添付ファイルはそのままでは決してクリーンアップされません。添付ファイルを破棄したい場合は、after_teardownコールバックで行えます。Storageでファイルが見つからないというエラーは表示されなくなります。Jobを使っている場合は、test環境でインラインキューアダプタを使うよう設定します。これにより、purgeジョブが(未来の不確定の時刻ではなく)ただちに実行するようになります。test環境向けに別のサービス定義を使えば、開発中に作成したファイルがテスト中に削除されないようにできます。test)の場合もアップロードしたファイルの自動クリーンアップは行われません。アップロードしたファイルをクリーンアップしたい場合は、after_teardownコールバックで行えます。Storageでファイルが見つからないというエラーは表示されなくなります。その他のクラウドサービスのサポートを実装するこれら以外のクラウドサービスをサポートする必要がある場合は、サービスを実装する必要があります。各サービスは、ファイルをアップロードしてクラウドにダウンロードするのに必要なメソッドを実装することで、ActiveStorage::Serviceを拡張します。Railsガイドを、もっと便利に。本サービスで得られた売上はRailsガイドを継続的に更新・運営するために活用させていただきます。管理・公開されております。出して頂けると嬉しいです。:)本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。株式会社https://yasslab.jp/支援・協賛Railsガイドは下記のサポーターから継続的な支援を受けています。までお問い合わせください。ライセンスに基づいて公開されています。よる登録商標で、すべての権利を有しています。