ActiveStorageの導入(2)
モデルの修正
Refile同様、ActiveStorageにはアップローダー用のクラスはありません。ActiveStorageが提供するhas_one_attachedメソッドの引数に、ファイルアップロード用の名称(ここではimage)をシンボルで指定するだけで済みます。
class Article < ApplicationRecord has_one_attached :image …(中略)…
なお、サンプルの例では、Articleモデルに対して画像は1つなのでhas_one_attachedを使用していますが、関連付く画像が複数ある場合は、ActiveStorageが提供するhas_many_attachedメソッドを使用します。この場合、:imagesと複数形で定義する必要があります。
has_many_attached :images
ビューファイルの修正
まず、フォームに画像パス用のフィールドを追加します。以下のように修正します。
…(中略)…
<div class="field">
<%= form.label :image %>
<%= form.file_field :image %>
</div>
…(中略)…
labelやfile_fieldの引数に指定するシンボルは、モデルで定義したhas_one_attachedの引数と合わせる必要があります。
次に、アップロードした画像ファイルを表示するために以下のように追加します。
…(中略)…
<p>
<strong>Image:</strong>
<% if @article.image.attached? %>
<%= image_tag @article.image %>
<% end %>
</p>
…(中略)…
このように、イメージが存在するかどうかを判断するにはActiveStorageが提供するattached?メソッドを使います。
コントローラーの修正
Strong Parameters用の修正を行います。
…(中略)…
def article_params
params.require(:article).permit(:title, :body, :image)
end
…(中略)…
動作確認
rails sコマンドでpumaサーバーを起動し、任意の記事を編集して画像がアップロードできることを確認します。
なお、ActiveStorageのデフォルト設定でアップロード後のファイルは、storageディレクトリ配下に、active_storage_blobs.keyに入っているファイル固有のキーに即して階層構造で保持されます。
まとめ
連載2回にわたって、ファイルアップローダーの主なgemのうち、CarrierWave/Refile/Shrineを紹介し、Rails 5.2から導入されたActiveStorageについても紹介しました。
ここまで紹介した通り、いずれも基本的な使い方は大差ありませんが、現時点ではActiveStorageはバリデーションやキャッシュが機能として備わっていないこともあり、ドキュメントや実績の豊富さの観点でCarrierWaveを選択するのが無難かなと、筆者は考えています。
ただし今後、ActiveStorageに既存のgemと同等の機能が実装されれば、Railsに取り込まれているActiveStorageが使われるようになるでしょう。
次回は、HTTPクライアントライブラリとして有名なFaradayを紹介する予定です。
