Ruby on Rails gem "CarrierWave"で画像アップロード機能実装
参考サイト
Rails で画像のアップロード機能を実装する - 30歳からのプログラミング
上記サイトのほぼコピペ。
Gem "CarrierWave"のインストール
[Gemfile]
gem 'carrierwave'
として、$ bundle install
$ rails generation uploader image
で"/app/uploaders/image_uploader.rb"にアップローダが生成される.
Modelの作成
Postモデルとし、name, imageのカラムを作成
$ rails generate model Post name:string image:string $ rails db:migrate
imageカラムを画像取り扱い用カラムとして設定
[/app/models/post.rb]
class Post < ApplicationRecord mount_uploader :image, ImageUploader end
コントローラと画像投稿フォームの設定
ルーティングを以下のように設定.
[/config/routes.rb]
Rails.application.routes.draw do get '/posts', to: 'posts#show' post '/posts/create', to: 'posts#create' end
コントローラの作成
rails generate controller Posts
[app/controllers/posts_controller.rb]
class PostsController < ApplicationController def show @posts = Post.all end def create @post = Post.new(permit_params) @post.save! redirect_to action: :show end private def permit_params params.require(:post).permit(:name, :image) end end
"private関数のpermit_params"は許可していない項目については変更されないようにするために設定する.
"show.html.erb"を作成してフォームを作成
[/app/view/show.html.erb]
<% @posts.each do |post| %> <p> <%= post.name %><br> <%= image_tag post.image.url %> </p> <% end %> <hr> <%= form_for :post, url: 'posts/create' do |f| %> <p><%=f.label "投稿者" %><br><%= f.text_field :name, placeholder: 'ハンドルネーム' %></p> <p><%=f.label "画像をアップロード" %><br><%= f.file_field :image %></p> <p><%= f.submit value: '投稿' %></p> <% end %>