CarrierWaveを使った画像のアップロード機能作成について

目次

CarrierWaveの導入方法

画像のアップロード機能を作成したい時はCarrierWaveという便利なgemを使うと比較的簡単に実装できる。

導入のためには以下のをgemfileに記述し、実行。

gem 'carrierwave'

実装方法

まず、アップローダーを作成。そのためには以下を実行。

rails g uploader Image

すると、アップローダーファイル(/uploaders/image.rb)が出来上がるので、以下記述。

class ImageUploader < CarrierWave::Uploader::Base
  # アップロードした画像の保存先パスを指定
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  # デフォルト画像の設定
  def default_url
    'ファイル名.jpgなど'
  end
end

次に画像のカラムを設定。例えば、投稿データを扱うpostsテーブルがあった場合、imageカラムを作成するマイグレーションファイルを作成し、実行。(注意:あくまで、画像名のカラムなので、string型等にする

rails g migration AddImageToPosts image:string

ただし、これだけではダメで、アップローダーを使いますよ!という宣言をする必要がある

そのためにはPostモデルに以下を記述。

class Board < ApplicationRecord
  mount_uploader : image, ImageUploader
  # 以下省略
end

コントローラーの実装。今回は単純な画像登録だけの場合。

class PostsController < ApplicationController
  def new
    @post = Post.new
  end
                      
def create @post = Post.new(post_params) if @post.save redirect_to posts_path, success: '投稿しました' else flash.now[:danger] = '投稿失敗' render :new end end    private     def post_params params.require(:post).permit(:image) end end

最後に、view側でデータを渡すためのフォーム実装。

<%= form_with model: @post, local: true do |f| %>
  <%= f.label :image %>
  <%= f.file_field :image %>
  <%= f.submit class: 'btn' %>
<% end %>

これで、データのアップロード機能実装は完了!

アップロードした画像の表示方法

image_tageに以下のような記載をすればOK!

<%= image_tag @post.image.url %>
ちなみに、このコードについては単純に画像を出力するだけでなく、画像の有無の判定をしてくれる。

言い換えると、@post.imageが存在すればその画像を、なければ設定したデフォルト画像を出力のように、条件分岐も含めたコードを1行で実現している(ありがたい)

その他:画像の形式を制限したい時

CarrierWaveには便利機能がいくつかあるが、例えばファイルの種類を制限したい時。

具体的にはjpgとpngだけにしたい、みたいな場合。

アップローダーファイルに以下を記述すればOK!

class ImageUploader < CarrierWave::Uploader::Base
  def extension_whitelist
    %w(jpg png)
  end
end