[Rails] Active Storage를 통해 확장자 validate를 만들 때 주의사항

개시하다


제목과 같이 Active Storage에서 확장자 관련validate를 만든 후 User가 서명하는 동안 오류가 발생했습니다.

이벤트


User 모델에서 Active Storage에 업로드된 이미지에 대한 확장자를 지정하는validate를 다음과 같은 느낌으로 만듭니다.
user.rb
class User < ApplicationRecord
  has_one_attached :image

  validate :image_content_type

  def image_content_type
    extension = ['image/png', 'image/jpg', 'image/jpeg']
    errors.add(:image, "の拡張子が間違っています") unless image.content_type.in?(extension)
  end

그러나 이후 사용자를 새 계정에 등록시키려면 다음과 같은 오류가 발생했습니다.
content_type delegated to attachment, but attachment is nil

까닭


이번에 크리에이트 User 때는 이메일이랑 패스워드만 했어요.
물론 이미지가 파라메스를 타지 않기 때문image.attached?false이다.
상기 오류는 이미지에attached가 없는데content_type가 호출되어 발생한 오류입니다.

해결책

image.attached?false일 때validate를 하지 않으면 해결 방법
user.rb
class User < ApplicationRecord
  has_one_attached :image

  validate :image_content_type, if: :was_attached?

  def image_content_type
    extension = ['image/png', 'image/jpg', 'image/jpeg']
    errors.add(:image, "の拡張子が間違っています") unless image.content_type.in?(extension)
  end

  def was_attached?
    self.image.attached?
  end
이렇게 되면 User는 순조롭게 create를 할 수 있습니다.

좋은 웹페이지 즐겨찾기