그동안 해온 초삽질의 완결판이라고 할 수 있겠다...한글문제 때문에 버린 시간이 그저 아깝기만 할 따름이다.
ruby 1.9 이상의 버젼에서 UTF-8 환경의 rails를 사용하려면 다음 3가지가 반드시 충족돼야 한다.
1. mysql을 연결할 때, "mysql"이 아닌 "ruby-mysql" gem을 설치해야 한다.
죽, gem install mysql하지 말고, gem install ruby-mysql 하라는 얘기다.
2. rails는 반드시 2.3.5 이상의 버젼을 설치한다.
3. 소스 코딩할 때 콘트롤러 rb파일 앞부분에 반드시
# coding : utf-8
이 한 줄을 추가한다.
이상의 3가지를 하면, 디비에 한글이 들어가있던 erb template에 한글이 들어가 있건 관계없다 다 잘된다.
대부분의 뻘짓이 출발하는 이유는 관행대로, mysql gem을 설치하기 때문이다. 나도 이것때문에 며칠을 날렸다. 바보처럼 ㅠㅠ
그러나, 이 상황에서도 문제가 생긴다.
erb파일에서 <%= link to %>같은 helper를 사용할 때,
helper 메소드의 파라미터에다가 한글을 집어넣으면 또 인코딩 문제가 발생한다.
이 상황에서는 방법이 없다. 직접 actionpack소스 코드를 손봐야 한다.
액션팩에서 액션뷰가 설치된 디렉토리로 간다. (보통의 리눅스 서버라면, /var/lib/gems/1.9.1/gems/actionpack-2.3.5/lib/action_view가 될 것이다. )
거기 가면, renderable.rb라고 있다. 이 파일을 직접 손봐야 한다.
source = <<-end_srcdef #{render_symbol}(local_assigns)old_output_buffer = output_buffer;#{locals_code};#{compiled_source}ensureself.output_buffer = old_output_bufferendend_srcbeginActionView::Base::CompiledTemplates.module_eval(source, filename, 0)rescue Errno::ENOENT => e
이 부분을 찾아서,
source = <<-end_srcdef #{render_symbol}(local_assigns)old_output_buffer = output_buffer;#{locals_code};#{compiled_source}ensureself.output_buffer = old_output_bufferendend_srcsource.force_encoding('utf-8') if '1.9'.respond_to?(:force_encoding)
beginActionView::Base::CompiledTemplates.module_eval(source, filename, 0)rescue Errno::ENOENT => e
빨간색으로 색칠한 한 줄을 추가하면 된다.
아파치+패신저 환경이라면 서버를 재실행 해줘야 한다.
이렇게까지 하면,
ruby 1.9.1 + rails 2.3.5 + mysql 5 환경에서 한글을 사용하는데 문제가 없게 된다.
rails 3에서도 유사한 문제가 있는 것으로 알고 있으니 내 환경보다 상위 버젼을 사용하는 분들에게도 적용될 것 같다.
취미로 하는 웹개발에 너무나 많은 정열을 쏟는 요즘이다 ㅠㅠ
2010. 4. 27 추가 내용
send_data명령어를 사용할 때 binary field에서 argument error가 나타나는 문제가 있다.
한글문제는 아니고... ruby 1.9와 rails 2.3.5의 인코딩 문제다. 젬을 또 수정했다.
/var/lib/gems/1.9.1/gems/activesupport-2.3.5/lib/active_support/core_ext/object/blank.rb에서
class String #:nodoc:def blank?beginself !~ /\S/rescuefalseendendend
위와 같이 수정했다. 삽질은 끝도 없구나.