專案中需要上傳檔案,像是圖片和音訊,因此來好好研究大家都說便利好用的 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
參考文章來源: