rails

Shrineを使ってRailsで画像投稿しよう!!


 

Railsでの画像アップロード機能を作成する

今回は画像アップロード機能ライブラリの『Shrine』の導入方法をメモしていきます!

Shrineのいいところは実装が簡単でミニマルに始めることができることです。

 

他の有名なアップロード機能ライブラリと言えば『rmagick』などがありますね。

 

Shrineのインストール

gemfile内に

gem "shrine", github: 'janko-m/shrine'

を記述して、
$ bundle install

をしてください。

 

shrine.rbを作成する

shrineに関する初期設定を書いていきます。

app/config/initializers/下にshrine.rbを作成してください。

require "shrine"
require "shrine/storage/file_system"

# アップロードするディレクトリの指定
Shrine.storages = {
  cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"),
  store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/store"),
}

# プラグイン
Shrine.plugin :activerecord

 

image_dataカラムの追加

前回まで作成していたNoteテーブルに画像を保存するカラムを作成します。

画像が入るカラムなので、imageという名前で作成したいです。

しかし、ここで注意が必要です。

shrineを使用して画像を保存する場合、カラム名には「_data」をつけてあげなければいけません。

なので今回は「image_data」カラムを追加します!

こちらをターミナルで打ってください。

$ rails g migration add_image_data_to_notes image_data:text

$ rails db:migrate

 

uploaderを作成

app/下にuploadersディレクトリを作成してください。

そして、app/uploaders/下にnote_image_uploader.rbを作成してください。

class NoteImageUploader < Shrine
end

Shrineを継承させることが大事です!

 

modelを編集

app/models/Note.rbを編集していきます。

このように編集してください。

include NoteImageUploader[:image]

を追加しました。

NoteモデルとUploaderががっちゃんこしました!

class Note < ApplicationRecord
  include NoteImageUploader[:image]
end

 

ストロングパラメータ

次はapp/controllers/notes_controller.rbを少しだけ編集します。

note_paramsにimageを追加することでストロングパラメータに対応しました。

注意が必要なのが、ここでは「image_data」ではなく「image」にすることです。

def note_params
      params.require(:note).permit(:content, :image)
end

 

 

投稿Form作成

今回はscaffoldしてできたformを編集します。

編集した結果がこちらです。

<%= form_with(model: note, local: true) do |form| %>
  <% if note.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(note.errors.count, "error") %> prohibited this note from being saved:</h2>

      <ul>
      <% note.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :content %>
    <%= form.text_area :content, id: :note_content %>
  </div>

<!-- ここから -->
  <div class="field">
    <%= form.label :image %>
    <%= form.file_field :image %>
  </div>
<!-- ここまで追加しました -->

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

 

<%= form.file_field :image %>

ここが一番大事ですね

image_dataではなく、imageにしましょう。

 

 

最後に

とても簡単ですね、
5分で試せると思うので、是非お試しください!


ABOUT ME
ささお
3年目iOSエンジニア。 スタートアップで働いておりやす。 プログラミングスクールとエンジニアのキャリアを考えたい。 作ったアプリ - https://apps.apple.com/us/app/loverprofile/id1463563845?l=ja&ls=1