【rails】paperclipを使って画像投稿機能を実装する方法

f:id:utr066:20170212191725p:plain やっぱり忘れないようにいろいろ書いておいた方がいいかなー。 ということでかなり前に使ったpaperclipについても書いておきます。

まずはプロジェクト作成。

rails new paperclip-sample -d mysql
rake db:create
which convert  # 無かったら次でインストール
brew install imagemagick

paperclipをインストール

gem 'paperclip'

機能を試すだけなのでscaffoldで。

rails g scaffold user

userモデルにavatarというカラムを割り当てます。このカラムにpaperclipでアップロードした画像を入れますよー。

rails g paperclip user avatar
rake db:migrate

Userモデルにpaperclipの設定を書く。 avatarカラムはUserモデルにあるのでUserモデルに設定を書きます。

class User < ActiveRecord::Base
   # photoをattachファイルとする。stylesで画像サイズを定義できる
  has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }
 # ファイルの拡張子を指定(これがないとエラーが発生する)
  validates_attachment :avatar, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }
end

画像を投稿できるようにnew.html.erbをいじる

<h1>New User</h1>

<%= form_for(@user) do |f| %>
<%= f.file_field :avatar %>
<% end %>

createアクションもいじる

  def create
    User.create(create_params)
    redirect_to action: 'index'
  end

  private

    def create_params
      params.require(:user).permit(:avatar)
    end

これでいける。

あとは表示するindex.html.erbをいじる。

<%= @users.each do |user| %>
<%= image_tag(user.avatar.url(:medium)) %>
<% end %>

表示完了。

・参考記事 ruby-rails.hatenadiary.com