LoginSignup

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

CarrierWaveを使って画像をアップロードできるようにしてみる

Last updated at Posted at 2016-11-22

今回はrailsで作ったappで
画像をアップロードできるように頑張りたいなと。

画像って便利じゃないですか。
最近知ったんですけど百聞は一見に如かずって言葉があるらしいんですよ。
正直百聞する前に諦めてしまうのであれなんですけど。
なんか頭の悪さが露見している感が否めないので頑張っていきます。

画像をアップロードしなくてもサービス上で画像を見れるようにすることができないわけではないです

例えばgoogle driveを使って撮った写真を一旦そっちに保存して
リンクを取得してそのリンクをサイトに張るようにするとか。

最初は超初期のサービスならこれでもいいかと思ったんですが
そんなクソめんどくさいんだかなんだかのサービス誰が使うんだよ
ゴミだろ。誰だよこんなアイデア考えた奴。◯んで詫びろよ。って言われた気持ちに勝手になったので
(◯は自主規制です。)
今回は1度も使ったことのないCarrierWaveというなんと呼んでいいのか日本語すらままならない僕には読めないgemを使ってみます。

1.とりあえず怖くていきなり実装するのはあれなので新しいappを作ってみる

 ターミナル
rails new try_carrierWave -d mysql

#ファイルができたら続けて以下を(DBを作ります)

rake db:create

2.viewとかを作っていくんだけど実装を試すだけのappなので

 ターミナル
rails g scaffold photo description:text

#上の奴ができたらできたら

rake db:migrate

description:textの部分は「:」の前がカラム名でtextはデータ型。
なので、この辺は任意で変えていただいて。
だから、なくてもいいし。

ここまではgemを使うために土台を用意しただけ。

ここからgemをインストールしていきます。

 Gemfile
 gem 'carrierwave'

追記しまして

 ターミナル
 bundle install

さっき一気にまとめて作ったphotosテーブルにimgのurlを保存するカラムを追加します

 ターミナル
rails g migration AddImageToPhotos image:string

#できたら

rake db:migrate

3.アップローダーを作る(アップロード機能を作る)

 ターミナル
rails g uploader image

imageのところはなんでもいいけどURLを保存するカラム名にしとくと良い

app/uploader.rbってファイルができていればOK

コードを追記

 app/model/photo.rb

mount_uploader :image, ImageUploader

4.viewを作る

viewに写真をuploadするためのアレをつけます

 app/views/photos/_form.html.erb

  <%= f.file_field :image %>


form_tagの場合は
<%= form_tag('/questions', method: :post, :multipart => true) do %>
上記のように「:multipart => true」が必須。

今回はapp/views/photos/_form.html.erbを指定していますが、実際に機能を実装するフォームに書いてください。

今回は一気に土台を作ったのでコントローラーのストロングパラメーターも変更する必要があります

 app/controllers/photo_controller.rb

    private
    # Use callbacks to share common setup or constraints between actions.
    def set_photo
      @photo = Photo.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def photo_params
      params.require(:photo).permit(:description, :image)
    end


photo_paramsのpermitに「:image」を追加します

 app/views/photos/index.html.erb

<td><%= image_tag photo.image.url %></td>


これでアップロードした画像をindex.html.erbで出力できるようになった。

これでサイズとか細かいことは置いておいて自分の持っている画像をuploadできて、かつindexで表示できるようになった。

次に、画像をuploadするときに画像のサイズを変更できるようにします。

 Gemfile

gem 'rmagick'


を追記

 ターミナル

bundle install


 app/uploader.rb

include CarrierWave::RMagick

    process resize_to_limit: [1200, 900]

    version :thumb do
        process resize_to_limit: [480, 360]
    end


これらを追記します

process resize_to_limit: [1200, 900]
ここでは画像のサイズを1200×900より大きくならない設定をしています。

基本的におそらく大きい方に合うようになっていて、画像の比率自体はおそらく変わらずで、例えば1500×900の画像を上げたとすると1200×720になります。

version :thumb do
process resize_to_limit: [480, 360]
end
下のこの部分では別のサイズ設定をしていて、ページによって画像のサイズを変えたい場合はこのように書くことで別の画像サイズを使うことができるようになります。

view側の変更は「version」を別に設定7ない場合は特に変更は必要なし。
「version」を別に設定している場合は、そのversionを使っている部分のviewのコードを書き換える必要があります

例えばindexの表示でversion:thumbを使う場合

 app/views/photos/index.html.erb

<%= image_tag photo.image.thumb.url %>


thumbを追記することでそのversionの画像サイズを利用することができます。

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up