ModelとTableを作成
$ rails g model Hoge image
$ rails db:migrate
gemを追加
Gemfile
gem 'carrierwave'
gem 'mini_magick'
$ bundle install
Uploaderを作成
$ rails g uploader Hoge
画像を保存するディレクトリや、許可する拡張子等を必要に応じて修正。
よく使う設定はあらかじめコメントとして記載されています。
app/uploaders/picture_uploader.rb
class HogeUploader < CarrierWave::Uploader::Base
storage :file
# アップロードファイルの保存先
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
# アップロード可能な拡張子のリスト
def extension_whitelist
%w(jpg jpeg gif png)
end
end
モデルにマウント
app/models/hoge.rb
class Hoge < ApplicationRecord
#mount_uploader 画像名を保存するカラム名, アップローダー名
mount_uploader :image, HogeUploader
end
画像をリサイズ
app/uploaders/picture_uploader.rb
class HogeUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process resize_to_fill: [1000, 500]
.
.
resize_to_fill
以外のオプションに関しては、以下の記事にわかりやすくまとめられています。
CarrierWave + RMagick 画像のリサイズをまとめてみました
Controller、Viewルーティングを作成
$ rails g controller hoges index
app/controllers/hoges_controller.rb
class HogesController < ApplicationController
def index
@new_image = Hoge.new
@all_images = Hoge.all
end
def create
@new_image = Hoge.new(hoge_params)
if @new_image.save
redirect_to hoges_url
else
render action: :index
end
end
private
def hoge_params
params.require(:hoge).permit(:image)
end
end
app/views/hoges/index.html.erb
<h2>画像アップロード</h2>
<%= form_with model: @new_image, local: true do |f| %>
<%= f.file_field :image %>
<%= f.submit 'アップロード' %>
<% end %>
<h2>アップロードした画像一覧</h2>
<% @all_images.each do |i| %>
<%= image_tag "/uploads/hoge/image/#{i[:id]}/#{i[:image]}" %>
<% end %>
config/routes.rb
Rails.application.routes.draw do
get 'hoges', to: 'hoges#index'
post 'hoges', to: 'hoges#create'
end
削除する場合
image_object = Hoge.first
image_object.remove_image! #画像のカラム名がhogeならremove_hoge!
image_object.save
TODO
・画像をS3にアップロード