carrierwave. (re)create image

carrierwave사용시, 새로운 version을 추가하거나 기존의 version중 process를 변경해야 하는 경우가 종종 발생합니다.

이때 새로 만든 혹은 변경된 version의 이미지를 생성을 해야 하는데, 방법은 크게 2가지 입니다.

  • 이미지을 재업로드해서, 이미지를 만드는 방법
  • 해당 이미지만 만드는 방법

1. 이미지 재업로드 하는 방법

은 웹페이지에서 일일이 하나씩 해주는 훌륭한 방법이 있습니다.

책 삽질마스터 표지

하지만 좀 더 아름다운 방법은 rails console에서 코드 한줄로 해결하는 방법이죠.

User.all.each { |u| u.update_attributes(profile: "#{Rails.root}/public/#{u.profile_url}") if u.profile.present? }

version 변경이 자주 일어나는게 아니라면, 위 코드 한줄로 해결하는것도 나쁘지 않은 방법입니다.
다만.이렇게 하게되면 model에 걸려있는 filter들도 함께 동작을 하게 됨으로 불필요한 리소스를 낭비하게 됩니다.

그래서

2. 해당 이미지만 만드는 방법

으로 가는것이 좀 더 나은 방법입니다.

여기서 miniMagick을 이용하는 모듈로 만들수 도 있는데, 상황에 따라서 RMagick을 쓸 수 도 있는것이라 Carrierwave에 모듈을 추가하는 방법이 안정적입니다.

사실 Carrierwave에 recreate_versions! 이란 메소드가 있습니다.
recreate_versions!은 모든 version을 다 만드는건데, (하단 ps.2참고)
특정 version 하나만 만드는 함수는 없습니다.

그래서 특정 version 하나만 만드는 함수를 만들어야 하는데.. 다행스럽게도 누군가가 코드를 짜놓았더군요.

감사하는 마음을 가지고 그대로 써먹습니다.

아래 코드를 아무대나 넣어줍니다.

저의 경우 config/initializers에 넣었습니다.

그리고 난 후

console창으로 가셔서 uploader.recreate_version!([VERSION]) 해주시면 됩니다.

예)

User.all.each { |user| user.profile.recreate_version!([VERSION]) }

근데, version 수정이 비일비재하게 일어난다면..

그때마다 console들어가서 일일이 타이핑해주기가 여간 귀찮은게 아닙니다.

그래서 간결하게 밖에서 과업을 수행할 수 있도록 task로 만들어봤습니다.

방법은 간단합니다.

위 코드를  lib/안에 적당한 파일명으로 넣습니다.

사용법은

rake generate_photo_version[“모델명”,”업로더이름”,”새로운 썸네일을 생성할 버전명”,”오버라이트 할것인지”]
입니다.
예를들면
  • User라는 모델에
  • profile이라는 uploader가 있고
  • normal 이라는 version을 추가했다면

rake generate_photo_version[user,profile,normal,false]

다른예로..

version :normal의 process를 변경하여.. 이미지를 새로 만들어야 할때


rake generate_photo_version[user,profile,normal,true]

하시면 됩니다.

PS

  1.  속도차이는 원본의 용량과 관계가 있을뿐,
    이미지 한개를 만들든 10개를 만들든.. 속도 차이는 미비합니다.
  2. 만약 모든 version을 다 다시 만들고 싶은 경우
    recreate_versions!를 사용하시면 됩니다. (https://github.com/jnicklas/carrierwave/blob/master/lib/carrierwave/uploader/versions.rb)
    사용예) User.first.profile.recreate_versions!
  3. http://menonrails.com/articles/33 에 투고되었습니다.

참고링크

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중