active storage란
rails5.2부터 추가된 파일 업로드를 간단히 실행해주는 기능 유사gem으로 paperclib,carrierwave 등이 있다.
설정방법
rails active_storage:install
rails db:migrate
모델설정
class User < ApplicationRecord
has_one_attached :avatar
end
기본적으로 사용하기 위해서는 위 설정만 해주면 동작한다.
avatar라는 컬럼을 따로 추가할 필요가 없고 모델에 has_one_attached
를 추가해주기만 하면
사용가능. :avatar말고 다른 이름으로 해도 됨.
컨트롤러 설정
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
reference:
https://qiita.com/kazuomatz/items/3cdbd2c40576c2e9d89b
https://qiita.com/hmmrjn/items/7cc5e5348755c517458a