環境
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に保存されない