SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール

Railsアプリケーションにファイルを簡単にアップロードするgem「Shrine」と「ActiveStorage」

これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール 第10回

ActiveStorageの導入(2)

モデルの修正

 Refile同様、ActiveStorageにはアップローダー用のクラスはありません。ActiveStorageが提供するhas_one_attachedメソッドの引数に、ファイルアップロード用の名称(ここではimage)をシンボルで指定するだけで済みます。

[リスト 11]app/models/article.rb
class Article < ApplicationRecord
  has_one_attached :image
…(中略)…

 なお、サンプルの例では、Articleモデルに対して画像は1つなのでhas_one_attachedを使用していますが、関連付く画像が複数ある場合は、ActiveStorageが提供するhas_many_attachedメソッドを使用します。この場合、:imagesと複数形で定義する必要があります。

has_many_attached :images

ビューファイルの修正

 まず、フォームに画像パス用のフィールドを追加します。以下のように修正します。

[リスト 12]app/views/articles/_form.html.erb
…(中略)…
  <div class="field">
    <%= form.label :image %>
    <%= form.file_field :image %>
  </div>
…(中略)…

 labelやfile_fieldの引数に指定するシンボルは、モデルで定義したhas_one_attachedの引数と合わせる必要があります。

 次に、アップロードした画像ファイルを表示するために以下のように追加します。

[リスト 13]app/views/articles/show.html.erb
…(中略)…
<p>
  <strong>Image:</strong>
  <% if @article.image.attached? %>
    <%= image_tag @article.image %>
  <% end %>
</p>
…(中略)…

 このように、イメージが存在するかどうかを判断するにはActiveStorageが提供するattached?メソッドを使います。

コントローラーの修正

 Strong Parameters用の修正を行います。

[リスト 14]
…(中略)…
    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を紹介する予定です。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
これだけは押さえておきたい! Rails開発で使えるgemパッケージ/ツール連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 竹馬 力(チクバ ツトム)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11339 2019/02/05 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー