Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

環境

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

6592sho
京都の大学生。 node.js とか触ってます。 よろしくお願いします〜。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away