[學習筆記] Carrierwave 套件

2021-05-12
Rails

專案中需要上傳檔案,像是圖片和音訊,因此來好好研究大家都說便利好用的 Carrierwave 套件。

以下會談到 Carrierwave + mini_magick

  • carrierwave 提供 Rails 上傳檔案的功能
  • mini_magick 可預設上傳圖片的尺寸
1
在 Gemfile 裡面加入gem 'carrierwave'gem 'mini_magick'

gem 後面可加上指定版本,可透過此連結查詢:RubyGems 版本查詢

⚠️ 安裝 mini_magick 前,須先 Homebrew 安裝 ImageMagick ⚠️

$ brew install imagemagick

$ convert -version 可確認是否安裝成功,成功會出現以下畫面

PS: Mac 安裝 imagemagick 時,可能會出現 error 😱

1
Error: python@3.9: the bottle needs the Apple Command Line Tools to be installed. You can install them, if desired, with:xcode-select --install

接下來只要照上面的提示,在終端機輸入 xcode-select --install 
之後會跳出視窗,透過 Mac 的 Xcode App 下載套件,可能會需要一些時間下載,下載完以後,於終端機再輸入一次brew install imagemagick即可順利安裝成功~

來善用 Carrierwave 內建的 uploader 功能吧!

舉例:要將專輯(album)資料庫建立專輯封面(cover)欄位

  • 輸入指令 $ rails g uploader Cover

會自動新增此目錄&檔案:app/uploaders/cover_uploader.rb

  • 我們來瞧瞧 cover_uploader.rb 👀

  • 第 4 & 7 行原本預設是被註解的,解開後就可套用 MiniMagick 套件

storage :file — > 本地端上傳

  • 第 12 行:本地上傳的圖片儲存路徑:/public/uploads/album/cover
  • 上傳成功以後會自己出現

storage :fog — > 雲端上傳(AWS S3)

  • 第 16 行手動加上以後,上傳的圖片即會是 500*500 mm 尺寸

建立資料庫 上傳圖片 所需欄位

  • 建立 migration,修改資料庫結構
    $ rails g migration add_cover_to_albums cover:string
    $ rails db:migrate
  • 會在db/migrate 出現 add_cover_to_albums.rb 檔案如下:
1
class AddCoverToAlbums < ActiveRecord::Migration[6.1]  def change    add_column :albums, :cover, :string  endend

修改 Models

Models: app/models/album.rb

1
class Album < ActiveRecord::Base  mount_uploader :cover, CoverUploaderend

讓 Album 綁定(mount) uploader,而且是上傳封面 CoverUploader

修改 Views

  • app/views/album/_form.html.erb,建立上傳的欄位
    <%= f.input :cover, as: :file, label: "新增封面" %> ( 上面的寫法是因為我是用 simple_form 建立表格 )
    ( 如果是 form_for 則是 <%= f.file_field :cover %> )
  • app/views/album/show.html.erb 加下方程式碼,顯示出上傳的圖片( image_tag 是固定用法 )
1
<p>  <strong> Cover: </strong>  <%= image_tag(@album.cover_url) if @album.cover? %></p>

!! 注意( )內是底線 url

修改 Controllers

最後,在 app/controllers/albums.controller.rb
加上允許上傳至欄位的參數

1
private  def album_params    params.require(:album).permit(:name, :cover)  end

// 通常會放在 private 裏面

花了將近三天的時間 debug, 最後總算是大功告成!
超感謝網路的大大們還有一起做專案的夥伴&助教指點迷津 😭

以上資訊可能會有遺漏&簡陋,再請多多包涵~
下一篇文章會提到上傳到 AWS S3

參考文章來源:

  1. https://ithelp.ithome.com.tw/articles/10199131
  2. https://ithelp.ithome.com.tw/articles/10199035
  3. https://www.stevenchang.tw/blog/2019/07/16/CarrierWave_and_AWS_S3

留言: