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 에 투고되었습니다.

참고링크

광고

brew가 실행은 되지만, 권한 문제로 실행이 안될때

제목이 이상한것 같지만, 아래 코드를 보자

 

 

brew를 실행하면, 되긴 하는데..
정작 설치를 하거나 업그레이드를 할려고 하면 권한 문제로 실행이 안된다.

나의 경우에는 맥북에서 아이맥으로 마이그레이션을 했는데, 그래서 생긴 문제인 듯 하다.

/usr/local에서 파일 오너가 root로 되어있다.

이걸 전부 내 계정으로 변경해주었다.

 

sudo chown -R hiphapis:wheel /usr/local

 

 

그리고 나서 업그레이드를 하니 잘 된다.

 

 

 
 

devise에서 sign_out시 서버가 기절할 경우. (Ruby Or Rails Bug인듯)

내용추가.
이리저리 좀 더 상황을 지켜보니..
Devise의 문제가 아니라 Ruby 1.9.2 or Rails 3.1 의 버그인것 같다.
path를 못찾는 경우 에러를 내지 않고, 끝까지 찾는다. 끝까지!

————

Devise를 붙이고 sign_out을 했는데 반응이 없다.

그러다가 몇초 후 내 맥도 반응이 없다.
Activity Monitor를 띄워보니, ruby 메모리 사용이 1.8G
응?
1.8G?
내눈을 의심하고 다시 봤는데 1.8G
가운데 .(점)만 빼면 욕이 되는 1.8G..
ㅡ.,ㅡ;
처음에는 84MB

 

 

sign_out누르니깐 몇초만에 1GB 돌파!!!

 

 

그대로 내비두면 4GB 메모리를 다 잡수실 기세라서 1GB넘는 시점에서 강제종료 해버렸다.
뭐가 문제인지 이리저리 추적을 해보니..
destroy 액션(sign_out)에서

sign_out_and_redirect

요 녀석이 의심스러워 이리저리 해보니, 역시나 이 녀석이 범인이었다.
문제는 redirect시 :root_path로 redirect하게 될 때가 있는데, 이때 :root_path를 찾지 못해 생기는 버그였다.
해결책은 크게 2가지가 있다.
1. :root_path를 만들어 주는 방법.
:root_path가 없어서 생기는 버그임으로, :root_path를 만들어 주면 된다.
routes.rb에 가서 주석처리된

 

# root :to => ‘welcome#index’

 

을 주석을 풀어주고, :to는 각자의 상황에 맞게 수정을 해주면 된다.

 

root :to => ‘getAway#Hi’

 

2. sign_out과 redirect를 따로따로.

 

sign_out_and_redirect

 

이 녀석이 하자다보니, 이 녀석을 안써버리면 그만이다.
직접 sign_out 시키고 상황에 맞게 redirect 하면 된다.

sign_out
redirect_to “넌 이미 아웃되었다.”

Rails routes에서 as 사용하기.

 
작업을 하다보면 종종 불필요한 prefix가 붙는 경우가 생긴다.

 

resources :article do
  resources :article_log
end
resources :log

 

사실 큰 문제는 없지만, article_log path을 적어줘야 할때

 

article_article_log_path

 

이런 요상한(?) naming을 가진 path가 되어버린다.
나 같이 깔끔한 사람(응?)은 이런거 눈뜨고 못본다.
난 무슨 일이 있어도

 

article_log_path

 

이렇게 쓰고 싶어 근질할테니 말이다.
당신도 그런가?
동지! 함께 원피스를 찾자!(응?)
이런 경우

 

:as

 

를 써주면 우리가 원하는(설마 나만 원하는건 아니겠지?) 형태로 사용할 수 있게 된다.

 

resources :article do
  resources :article_log, :as => :log
end
resources :log

 

이렇게 :as를 추가해주게 되면

article_article_log_path

가 아닌

article_log_path

로 path가 잡히게 된다.
못믿겠으면

 

rake routes

 

해보라!

Rails 3.1 Overview

 
아시다시피 5월 5일 Rails 3.1 Beta 1 이 Release되었다.
많은것들이 바뀌었는데 그것들중 알고 넘어가면 좋을법한것 몇가지만 추려 간략하게 Overview해보았다.

설치

rvm 1.9.2@railspre –create
gem install rails –pre

 

Javascript

Rails 3.1부터 prototype.js가 아닌 jQuery와 CoffeeScript가  Default로 탑재되어 있다.
만약 jQuery가 아닌 prototype.js를 계속 사용하고자 할 경우,

rails new [APP_NAME] -j prototype

해주면 된다.

새로 추가된 Gems

  • sass: haml에 포함되어 있던 sass가 독립되어 나왔다.
  • coffee-script
  • uglifier: JS를 하나의 파일로 합쳐준다.
  • jquery-rails

 

디렉토리 구조 변경

Public아래에 있던 Javascript, Stylesheets, Images가
/app/assets/ 로 이동되었다.
그러므로 웹엔진(Nginx등)에서 Js, Css, Image를 Rails한테 안넘기고 직접 처리하도록 세팅이 되어 있었다면, 관련 부분은 수정이 있어야 한다

Sprockets

application.css, application.js에 보면

 //= require jquery

처럼 주석처리된 require들이 있는데, 이건 주석이 아니라 sprockets의 require(include)하는 문법이므로 해당 구문을 삭제하면 include가 안된다.

Migration

migration file의 change 메소드가 추가되었다.
과거에는 up, down으로 메소드가 분리되어 있었지만, change로 통합되었다.
하지만 종종 제대로 동작하지 않을때도 있는데 그럴땐 up, down을 만들어서 사용하면 된다.

그리고 :belongs_to가 추가되었는데, 과거 relationship을 같게 될 경우 직접 index key(article_id:integer)를 만들어 줬었다.
3.1 에서는 belongs_to를 이용하면 되는데.

rails g scaffold comment article:belongs_to body:text

이렇게 써주면되며, belongs_to로 만들면 add_index도 시켜준다.

Console

콘솔에서 DB Query가 노출이 되었는데.. 상황에 따라선 이게 과잉친절이 될 수 도 있을 듯 하다.

Active Record

  • :has_many에서 :through를 다중깊이까지 사용할 수 있게 되었다.
  • 그리고 :through에서 :dependent 도 지원을 한다.
  • :as 가 추가되었다.
  • default_scope가 block으로 처리할 수 잇게 되었으며 lambda, method를 사용할 수 있다.

    default_scope { … }
    default_scope lambda { … }
    default_scope method(:foo)

  • update_column이 추가되었는데, update_attribute와 동작은 유사하지만 validation과 callback을 무시하고 update한다.

    User.first.update_column(:name, “sebastian”)

  • inverse_of가 추가되어서 예제 코드처럼 post.tags.build가 가능하다.
     

    class Post < ActiveRecord::Base
    has_many :taggings
    has_many :tags, :through => :taggings
    end

    class Tagging < ActiveRecord::Base
    belongs_to :post
    belongs_to :tag, :inverse_of => :tagging # :inverse_of must be set!
    end

    class Tag < ActiveRecord::Base
    has_many :taggings
    has_many :posts, :through => :taggings
    end

    post = Post.first
    tag = post.tags.build :name => “ruby”
    tag.save # will save a Taggable linking to the post

     

  • has_many의 :conditions에서 sql을 직접 쓰는것의 사용법이 바뀌었다.
    // Before
    has_many :things, :conditions => ‘foo = #{bar}’

    // After
    has_many :things, :conditions => proc { “foo = #{bar}” }

  • has_secure_password라는 메소드가 추가가 되었는데, Authentication을 직접 만들어서 쓸 경우 아주 유용하게 사용할 수 있다.
    새삼스럽지만, 3.1되면서 부터 Authentication Tool은 안써도 될 듯 하다.

 

Action Pack

 

  • auto_link가 제거되었다. 만약 계속 사용할것이라면 rails_autolink gem을 이용하면 된다.
  • :authenticity_token 을 form_tag에서 option으로 바뀌었다. 생략하거나 수정이 가능하다.
  • rhtml, rxml이 제거되었다.
  • csft_meta_tag가 복수로 rename되었다. csft_meta_tags
  • HTML5의 “data” attribute를 hash로 제공한다
    tag(“div”, :data => {:name => ‘Johan Kim’, :city_state => %w(Seoul)})

 

Active Support

 

  • Object#in?
  • weeks_ago
  • pre_week

간략하게 이 정도 인 것 같다.
관심이 있다면 https://gist.github.com/958283 를 확인하면 자세한 내역이 나온다.

http://menonrails.com/articles/14 에 기고된 포스팅 입니다.

참고링크

 

간만에 Rails왔더니 Rails3로 업데이트가… #1

한동안 IPhone, IPad, Android 개발하다가, 잠들어 있던 개인프로젝트를 다시 시작할려고 맘을 먹었다.

Rails2 기반이어서, 깔끔하게 새로 만들자는 마음으로 Rails3를 설치를 했다.
Rails3로 넘어가면서 어떤것들이 바뀌었나 찾아보고 Railscasts도 보면서 틈틈이 학습을 해놓았지만..
역시 난관은 있었다.
내가 부닥쳤던 난관들을 정리해서 올리면, 어떤분은(한분이라도..) 도움을 받으시지 않을까 하는 소박한 희망에 몇자 끄적여본다.
이상하다. 문명히 예전에는 plugin install하고 script/generator 로 initialize를 했었는데..
Could not find generator authentiaceted.
이리저리 찾아봐도 별다른 말은 없고 technoweenie의 restful-authentication이 아닌 satin의 restful-authentication만 딸랑 링크가 걸려있다.
Sation의 restful-authentication의 install 설명을 봐도, 내가 한것과 틀린것이 없다.
아 뭐지 -ㅅ-;;
그러던 찰라
“아. technoweenie가 아직 Rails3 버전을 안맞들었고, Sation은 작업을 해놓은건가?” 라는 의문이 생기고..
Sation걸로 install을 하고 initialize하니 잘 된다.
하지만 막상 사용할려고 하면
uninitialized constant ApplicationController::AuthenticatedSystem

라고 한다.

include AuthenticatedSystem

require File.join(Rails.root, ‘lib’, ‘authenticated_system.rb’)
로 바꿔주니깐 되긴 하는데, lib아래 있는 모든 파일을 이렇게 불러올 수 는 없는 노릇.
뭔가 더 스마트한 방법이 있을것 같긴한데.. Railscasts에서 이 내용을 본것같아 이리저리 뒤져봐도 못찾고.
결국 구글링으로 알아냈다.
application.rb 에다가
config.autoload_paths << File.join(config.root, “lib”)
해주면 된다.
2. haml
예전에는 gem으로 설치하고, 그 후에 plugin install을 해줬어야 했다.
난 당연히 plugin install을 했는데, 왠걸 initialize가 제대로 안된다.
vendor/plugin/haml보니 init.rb은 있는데 0 bytes고..
haml을 initialize하면 생기는 파일은 init.rb 딸랑 하나인데, 이 녀석이 하는 일은 haml gem을 불러오는것 뿐이다.
그런데…..
Rails3부터 bundler가 추가되면서 Gemfile이라는게 생겼다, init.rb가 존재해야 할 명분이 사라져 버린것이다.
init.rb가 하던일을 Gemfile에 gem ‘haml’ 적어주면 끝나니 말이다.
Gemfile에
gem ‘haml’
을 적어주고,
$user> bundle install
하면 끝.
3. Routes => :path_prefix
내가 작업했던 수없이 많은 개인 프로젝트(오픈한것은 NA;;)들의 Routes에는 :path_prefix가 꼭 사용되었었다.
근데, Rails 3로 오면서 이녀석 Deprecated…..;;
혹시나 하는 마음에
scope “:user_login” do

해봤는데 안된다.

혹시나 하는 마음에 한번더 시도를 해보았는데
scope “(/:user_login)” do
이렇게 하니 된다.
예전에는 resources 하나하나 모두 :path_prefix를 적어주어야 하는 번거로움이 있었는데
이와 같은 방식으로 변해서, 보다 깔끔하게 코드를 작성할 수 있게 되었다.
ps. 작업하다 추가되는것들은 모아놨다가 또 포스팅할 계획임.
ps2. 한국루비사용자모임도 죽은지 오래.. 살아있는 Ruby Forum이 없는것 같은데.. 하나 만들까 -ㅅ-;
도메인은 사놓은게 있긴 한데..