記事概要
Ruby on Railsに画像加工のツールを導入する方法について、まとめる
前提
- Ruby on Railsでアプリケーションを作成している
導入するツール
Active Storage
ファイルアップロード機能を簡単に実装できるGem
ImageMagick
コマンドラインから画像に処理を加えることができるツール
画像の作成やサイズ変更、保存形式の変更などの処理がある
Gemではなくソフトウェアであるため、Homebrewからインストールする
MiniMagick
ImageMagickの機能をRubyで扱えるようにしてくれるGem
RailsでImageMagickを扱うために必要
ImageProcessing
MiniMagickでは提供できない、画像サイズを調整する機能を提供するGem
手順(ImageMagickをインストール)
- 下記コマンドを実行する
# アプリのディレクトリに移動 % cd ~/[アプリ名] # ソフトウェア「ImageMagick」をインストール % brew install imagemagick
手順(Gemをインストール)
- Gemfileに下記を追記
# 最終行に、下記を記述する gem 'mini_magick' gem 'image_processing', '~> 1.2'
- MiniMagickとImageProcessingをインストールする
インストール方法は、こちらを参照 - MiniMagickを使用するため、設定ファイルを変更する
config/application.rb
module アプリ名 class Application < Rails::Application # MiniMagickの設定変更 config.active_storage.variant_processor = :mini_magick # 省略 end end
- サーバーを再起動する
手順(Active Storageをインストール)
- 下記コマンドを実行し、Active Storageに関連したマイグレーションが作成される
# アプリのディレクトリに移動 % cd ~/[アプリ名] # Active Storageのインストール % rails active_storage:install
- マイグレートする
マイグレート方法は、こちらを参照 - テーブルが3つ追加されたことを確認する
手順(画像を保存するための実装)
- 「Active Storageのテーブル」と「画像を紐づけるテーブル」のアソシエーションを定義する
message.rb
class Message < ApplicationRecord has_one_attached :image end
- 画像を紐づけるテーブル(messagesテーブル)に、カラムを追加する必要はない
- コントローラーに、imageカラムの保存を許可する
messages_controller.rb
# 省略 private def message_params # imageという名前で送られてきた画像ファイルの保存を許可 params.require(:message).permit(:content, :image) end
手順(保存した画像を表示)
-
image_tagメソッドを記述し、画像を表示する
<!-- 画像が存在する場合のみimage_tagが読み込まれる --> <%= image_tag message.image if message.image.attached? %>
手順(バリデーションを設定)
- 画像かテキストどちらかが存在していれば、メッセージを送信できるように実装する
message.rb
class Message < ApplicationRecord has_one_attached :image # was_attached?メソッドの返り値がfalseならばバリデーションによる検証を行う validates :content, presence: true, unless: :was_attached? # 画像があればtrue、なければfalseを返す def was_attached? self.image.attached? end end
Ruby on Railsまとめ