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 %>

データの削除

データの削除は以下でできるらしい。
参考サイト
CarrierWaveでアップロードしているファイルを削除する - Qiita


今度試してみよう。