Posted at

CarrierWave, RMagickを使ってRailsで画像を投稿できるようにする。


環境

mac OS 10.14.3

Ruby 2.4.1

Ruby on Rails 5.2.2


やりたいこと

Railsで画像を投稿したい!


使用ライブラリ

CarrierWave

RMagick


手順


1. Gemfile にgemを挿入し、インストール。


Gemfile

(省略)

gem 'carrierwave'
gem 'rmagick'

$ bundle install


2. config/locales/application.rb におまじないを書き込む。


application.rb

module Workspace

class Application < Rails::Application
.省略
.
.
#おまじない開始
config.autoload_paths += Dir[Rails.root.join('app', 'uploaders')]
#おまじない終わり
end
end


3. アップロードファイルを作成。(ファイル名は任意)

$ rails g uploader image


4. uploaders/image_uploader.rb に画像のサイズ等を指定するメソッドを書き込む。


image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base

(省略)

# サムネイルを生成する設定
version :thumb do
process :resize_to_limit => [300, 300]
end

#画像が回転してしまう問題を解消
process :fix_rotate

def fix_rotate
manipulate! do |img|
img = img.auto_orient
img = yield(img) if block_given?
img
end
end

#画像サイズの大きさを制限
def size_range
1..5.megabytes
end

(省略)

end


画像加工についてもっと詳しく知りたい方はこちら!


5. ユーザーモデル(モデル名,カラム名は任意)を生成し、モデルを関連付ける。

$ rails g model User image:string

$ rails db:migrate


user.rb

mount_uploader :image(⬅︎上記で生成したカラム名), ImageUploader(⬅︎3で生成したアップローダーの名前Uploader



6. ルーティング、ビュー、コントローラの部分を作成。


routes.rb

root to: "users#index"

get "/new", to: "users#new"
post "/create", to: "users#create"


users_controller.rb

def index

@users = User.all
end

def new
end

def create
User.create(image:params["users"]["image"])
redirect_to "/"
end



new.html.erb

<%= form_tag("/create",:multipart => true) do %>

<%= label_tag "form-image", "画像" %>
<%= file_field :users, :image, id:"form-image" %>
<%= submit_tag "新規作成"%>
<% end %>


index.html.erb

<% @users.each do |u| %>

<%= u.image %>
<% end %>


完成!!(注意)

これでRailsで画像投稿ができるようになりました!!

ただし、デプロイ後はAWS S3のような画像ストレージサービスに登録しないと、画像が表示できなくなるので要注意です!


参照

CarrierWaveとrmagickで画像アップロード機能を作る

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

railsでcarrierwaveを使って画像をアップロード、表示

Carrierwaveでアップロードした画像が回転して表示されてしまう問題を解決する

carrierwaveを利用して画像をアップロードしたがDBに保存されない