Active Storage 使用

Posted by Anthony Chao on 2019-09-28

Active Storage

這是一個 Rails 5.2 版本之後才推出的新功能,而且在製作專案的時候也會用到,因此這次才來看看這個功能如何使用
Rails Guide 的內容請看這邊

要使用這個功能,一開始就要先執行兩個指令

1
2
rails active_storage:install
rails db:migrate

這個動作會產生兩個 table : active_storage_blobsactive_storage_attachments,其中 active_storage_attachments 會儲存相對應 class name,所以如果有修改的話,也記得額外做一個 migration 檔改變這表格的相對應內容

1
2
3
4
5
6
7
8
9
# config/environments/development.rb
# config/environments/production.rb
config.active_storage.service = :local

# config/storage.yml

local:
service: Disk
root: <%= Rails.root.join("storage") %>

做完這些前置作業後差不多可以來動工了

附加檔案又分成一個 model 有多個檔案跟一個 model 有一個檔案,以下一一來介紹

一個 model 附加單一檔案

如果你想要在 User model 可以新增圖片的話,只需要加上這一行

1
has_one_attached :avatar

其中這個 avatar 可以把它想像成是 User 有個照片的虛擬欄位叫做 avatar

在表單需要上傳的時候這樣表示:

1
<%= form.file_field :avatar %>

然後 Strong parameter 的部分不要忘記修改,記得加上這個虛擬欄位

1
params.require(:user).permit(:email_address, :password, :avatar)

用 attach 這個方法把檔案或照片加到 User 身上

1
user.avatar.attach(params[:avatar])

另外還可以用 attached? 這個方法判斷是不是有附加檔案

一個 model 附加多檔案

如果是多個檔案或照片的話,用法大同小異,在 model 檔案加上這行:

1
has_many_attached :avatars

然後在 Strong parameter 的使用上改成陣列形式

1
params.require(:message).permit(:title, :content, avatars: [])

圖片顯示及變形

如果附加的是圖片,然後需要顯示出來
在目前的版本,需要搭配 MiniMagick 這套件來使用

1
2
#gemfile
gem 'mini_magick', '~> 4.5', '>= 4.5.1'

然後在顯示的頁面使用 variant 方法來改變尺寸

1
<%= image_tag user.avatar.variant(resize_to_limit: [100, 100]) %>

刪除 / 連結到上傳檔案

要刪除檔案的話,使用 purge 這個方法

1
user.avatar.purge

有幾個方式可以連結到這個檔案本身:

1
2
3
4
5
6
#直接把連結指向這檔案
url_for(user.avatar)
#下載檔案的連結
rails_blob_path(user.avatar, disposition: "attachment")
#如果要在 controller 跟 view 以外的部分連結,需使用絕對路徑
Rails.application.routes.url_helpers.rails_blob_path(user.avatar, only_path: true)

以上是 Active Storage 的介紹~ 今天的內容就先到這邊囉!

參考資料:

Rails Guide

Active Storage 開箱文





prevent_hack