Tag: CarrierWave

目次

関連ページ

参考情報

デモプロジェクトの作成

Gemfile

  • 以下を追加し、bundle updateを実行
    gem 'carrierwave'
    gem 'rmagick'
    

準備

  • アップローダーの生成
    $ bundle exec rails g uploader image
    
  • マイグレーションファイル
    $ bundle exec rails g migration add_image_to_books image:string
    #=> db/migrate/xxxxx_add_image_to_users.rbが生成される。
    
  • マイグレーション実行。Booksテーブルにimageカラムが追加される。imageカラムにはファイル名が保存される。
    $ bundle exec rake db:migrate
    
  • Bookモデルにアップローダーをマウント。
    class Book < ActiveRecord::Base
      validates :title, :presence => true
      # 下記を追加
      mount_uploader :image, ImageUploader
    end
    
  • controllerを変更。
        def book_params
          params.require(:book).permit(:title, :author, :summary, :image)
        end
    

Uploaderの修正

  • app/uploaders/image_uploader.rbを編集し、画像サイズや、ファイルの保管場所などの設定を行う。

Viewの編集

  • 編集画面。
    <%= form_for(@book) do |f| %>
          (...省略...)
          <%= f.label :image %>
          <%= f.file_field :image %>
          (...省略...)
    <% end %>
    
    
  • 表示画面。@book.image.<アップローダーで付けた縮小画像の名前>.urlでアクセス。
        <% if @book.image? %>
            <%= image_tag @book.image.s.url %>
        <% else %>
            画像がありません
        <% end %>
    

Tips

ちょっとだけ異なるUploaderを作りたい。

  • 例えばimage1とimage2でベースとなるファイル名だけ変えたい場合。CarrierWave::Uploader::Baseを継承したベースクラスを作りそこからさらに継承するのはできない(仕様上うまく動かないらしい)。
  • Uploaderからカラム名などにアクセスできるのでそれを使うのが簡単かも。例えばカラム名をそのままファイル名に使いたい場合、mount_asが使える。
    • book.rb
      class Book < ActiveRecord::Base
        validates :title, :presence => true
        # 下記を追加
        mount_uploader :image, ImageUploader
        mount_uploader :image2, ImageUploader
      end
      
    • image_uploader.rb。マウントされたカラムによってファイル名が変わる。
        def filename
      #    "image1.jpg" or "image2.jpg"
          "#{mounted_as}.jpg"
        end
      

縮小すると画質が劣化する

  • How to: Specify the image quality · carrierwaveuploader/carrierwave Wikiにある方法でqualityは指定できる(があまり影響なし?)。それだけでなくunsharp_maskも指定したほうがいいかも。config/initializers/carrierwave.rbを作成。
    module CarrierWave
      module RMagick
    
        def quality(percentage)
          manipulate! do |img|
            img.write(current_path){ self.quality = percentage } unless img.quality == percentage
            img = yield(img) if block_given?
            img
          end
        end
    
        # reduce image noise and reduce detail levels
        #
        #   process :blur => [0, 8]
        #
        def blur(radius, sigma)
          manipulate! do |img|
            img = img.blur_image(radius, sigma)
            img = yield(img) if block_given?
            img
          end
        end
    
        def unsharp_mask(radius, sigma, amount, threshold)
          manipulate! do |img|
            img = img.unsharp_mask(radius, sigma, amount, threshold)
            img = yield(img) if block_given?
            img
          end
        end
    
      end
    end
    
  • ImageUploaderで指定する。ImageMagicの縮小オプションだと「convert -quality 90 -unsharp 2x1.4+0.5+0 -resize 560x560」に相当?
    class ImageUploader < CarrierWave::Uploader::Base
    
      version :m do
        process :resize_to_limit => [560, 560]
        process :quality => 90
        process :unsharp_mask => [2, 1.4, 0.5, 0]
      end
    
    end
    

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:48:28 (1013d)