Rails active storage란

Posted by negabaro kim on Saturday, May 2, 2020 Tags: rails   3 minute read

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_fieldhas_one_attached에서 지정한 이름을 똑같이 적어주자 active storage를 이용시 variant를 이용해서 사이즈를 줄여준다든지 imagemagick의 커맨드를 실행해 줄 수 있다.

메모1(vs paperclip,carrierwave)

paperclip,carrierwave와 비교하면 rails default로 들어가 있어서 추가gem을 넣을 필요없음(도입이 간단) cache나varidation기능이 없음.

메모2

rails active_storage:install실행시

active_storage_blobsactive_storage_attachments라는 2개의 테이블이 생김 각각 Blob와Attachment라는 2개의 모델을 사용하는데 Blob에는 파일명,파일종류,바이트수,오류검출등을 메타데이터는 저장하는 역할이고 Attachment모델은 Blob와Active Record간의 중간테이블 역할이다.

특별한 일이없는한 다이렉트로 Blob,Attachment모델을 건드릴 일은 없음.(알아서 돌아감)

메모3

위에서 잠깐 언급했듯이 variant를 이용해서 imagemagick의 커맨드를 실행할 수 있음

흑백이미지

image

current_user.avatar.variant(resize:'200x200',type: :grayscale).processed

반전

image

current_user.avatar.variant(resize:'200x200',flop:true).processed

blur효과

image

current_user.avatar.variant(resize:'200x200',blur:50).processed

회전효과

image

current_user.avatar.variant(resize:'200x200',rotate:30).processed

보더설정

image

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が標準になりました。