active storage란
active_storage
rails5.2부터 추가된 파일 업로드를 간단히 실행해주는 기능 유사gem으로 paperclib,carrierwave 등이 있다.
설정방법
rails active_storage:install
rails db:migrate
マイグレーションを実行すると以下 3 つのテーブルが作成されます。
テーブル名 内容 active_storage_blobs アップロードしたファイル(画像)を保存するテーブル(blob 型) active_storage_attachments アップロードしたファイルと Active Record を紐付けるための中間テーブル active_storage_variant_records アップロードしたファイルの Variant に関する情報を保存するテーブル
blob とは】 DB のデータ型の一つで、画像や音声、圧縮ファイルなどのデータを保存するためのもの。
【variant とは】 Rails の blob 型のデータに対して使えるメソッドの一つで、画像を呼び出したときに、ビューの中で画像サイズを変換することができる。
모델설정
class User < ApplicationRecord
has_one_attached :avatar
end
기본적으로 사용하기 위해서는 위 설정만 해주면 동작한다.
avatar라는 컬럼을 따로 추가할 필요가 없고 모델에 has_one_attached
를 추가해주기만 하면
사용가능. :avatar말고 다른 이름으로 해도 됨.
has_many_attached :images # ←複数枚画像の場合。1枚のみの場合は has_one_attached :image
컨트롤러 설정
def update
current_user.update(user_params)
redirect_to request.referrer
end
private
def user_params
params.require(:user).permit(:avatar)
end
컨트롤러에서는 param으로 받아주기만 하면됨
뷰설정
= form_with(model: current_user, url: my_profiles_path, method: 'put') do |f|
= image_tag(current_user.avatar.variant(resize:'200x200')) if current_user.avatar.present?
= f.file_field :avatar, lang: 'en'
= f.submit 'update'
file_field
에 has_one_attached
에서 지정한 이름을 똑같이 적어주자
active storage를 이용시 variant를 이용해서 사이즈를 줄여준다든지 imagemagick의 커맨드를 실행해 줄 수 있다.
메모1(vs paperclip,carrierwave)
paperclip,carrierwave와 비교하면 rails default로 들어가 있어서 추가gem을 넣을 필요없음(도입이 간단) cache나varidation기능이 없음.
메모2
rails active_storage:install
실행시
active_storage_blobs
와active_storage_attachments
라는 2개의 테이블이 생김
각각 Blob와Attachment라는 2개의 모델을 사용하는데
Blob에는 파일명,파일종류,바이트수,오류검출등을 메타데이터는 저장하는 역할이고
Attachment모델은 Blob와Active Record간의 중간테이블 역할이다.
특별한 일이없는한 다이렉트로 Blob,Attachment모델을 건드릴 일은 없음.(알아서 돌아감)
메모3
위에서 잠깐 언급했듯이 variant를 이용해서 imagemagick의 커맨드를 실행할 수 있음
흑백이미지
current_user.avatar.variant(resize:'200x200',type: :grayscale).processed
반전
current_user.avatar.variant(resize:'200x200',flop:true).processed
blur효과
current_user.avatar.variant(resize:'200x200',blur:50).processed
회전효과
current_user.avatar.variant(resize:'200x200',rotate:30).processed
보더설정
current_user.avatar.variant(combine_options:{resize:'200x200',border:'5',bordercolor:'red'}).processed
rails7에서의 Active Storage
Active Storageの画像処理でlibvipsを使用するように Active Storageで画像処理に使われるGemで、以前のバージョンではmini_magickが使用されていましたが、Rails 7からはvipsが標準になりました。