에러 메시지를 한글화하는데 있어서, 크게 세가지 정도의 문제점을 생각해 볼 수 있다.
첫째는 에러메시지 자체가 영어로 되어있다는 점이다.
Rails에서 Model 클래스에 validation을 설정하면 ActiveRecord::Base#save 시에 validation이
check되면서, error 메시지를 Base의 errors 객체에 설정하게 되어있다. 이 메시지는
ActiveRecord::Errors의 @@default_error_messages 라는 class 변수에 선언이 되어 있고,
accessor가 설정되어있다. 따라서 이 문제는 ActiveRecord::Errors의 default_error_messages를
재설정함으로써 해결할 수 있다.
두번째는 필드명의 한글화이다. Rails에서 최종적으로 full message를 만드는
ActiveRecord::Errors#full_messages를 보면 Base 클래스의 human_attribute_name 메서드를
사용함을 알 수 있다. 이는 String#human_name 메서드를 이용해서 'my_name'이라는 속성명을
'My Name'으로 바꾸어준다. 따라서 human_attribute_name 클래스를 override 하여야 한다.
마지막으로 조사의 처리이다. 영어에서는 속성명과 에러메시지를 붙이기만 하면 문장이 되지만,
한글에서는 속성명에 적당한 조사를 넣어주어야 한다. 이 문제를 해결하려면
Ruby에서 한글 자소 분리 (초성, 중성, 종성)에서 사용한 로직을 이용해서, 각각의 경우에
따른 조사를 붙여야 한다.
User 라는 Model 클래스가 있다고 가정하면
이렇게 설정할 경우, <%= error_messages_for :user %> 에서 적절한 한글 메시지를 볼 수 있게 된다.
첫째는 에러메시지 자체가 영어로 되어있다는 점이다.
Rails에서 Model 클래스에 validation을 설정하면 ActiveRecord::Base#save 시에 validation이
check되면서, error 메시지를 Base의 errors 객체에 설정하게 되어있다. 이 메시지는
ActiveRecord::Errors의 @@default_error_messages 라는 class 변수에 선언이 되어 있고,
accessor가 설정되어있다. 따라서 이 문제는 ActiveRecord::Errors의 default_error_messages를
재설정함으로써 해결할 수 있다.
두번째는 필드명의 한글화이다. Rails에서 최종적으로 full message를 만드는
ActiveRecord::Errors#full_messages를 보면 Base 클래스의 human_attribute_name 메서드를
사용함을 알 수 있다. 이는 String#human_name 메서드를 이용해서 'my_name'이라는 속성명을
'My Name'으로 바꾸어준다. 따라서 human_attribute_name 클래스를 override 하여야 한다.
마지막으로 조사의 처리이다. 영어에서는 속성명과 에러메시지를 붙이기만 하면 문장이 되지만,
한글에서는 속성명에 적당한 조사를 넣어주어야 한다. 이 문제를 해결하려면
Ruby에서 한글 자소 분리 (초성, 중성, 종성)에서 사용한 로직을 이용해서, 각각의 경우에
따른 조사를 붙여야 한다.
User 라는 Model 클래스가 있다고 가정하면
- class String
- @@josas = {'이' => '가', '은' => '는', '을' => '를', '과' => '와'}
- def with_josa(josa)
- if separate.last =~ /[aeiou]/i separate.last == ''
- self + @@josas[josa]
- else
- self + josa
- end
- end
- end
- class ActiveRecord::Base
- # 필드명을 저장하는 class variable
- @@field_name = {}
- cattr_accessor :field_name
- class << self
- # Base.human_attribute_name override
- def human_attribute_name(attribute_key_name)
- name = @@field_name[attribute_key_name].with_josa('은') attribute_key_name.humanize
- end
- # 필드명을 등록하는 class method.
- def register_attr_name(attr_hsh = {})
- @@field_name.merge!(attr_hsh.stringify_keys)
- end
- end
- end
- ActiveRecord::Errors.default_error_messages = {
- :inclusion => "리스트에 포함되지 않습니다.",
- :exclusion => "제한되었습니다.",
- :invalid => "유효하지 않습니다.",
- :confirmation => "확인과 맞지 않습니다.",
- :accepted => "반드시 동의하셔야 합니다.",
- :empty => "비어있을 수 없습니다.",
- :blank => "공백일 수 없습니다.",
- :too_long => "최대 %d 문자 이하이어야 합니다.",
- :too_short => "최소한 %d 문자 이상이어야 합니다.",
- :wrong_length => "정확히 %d 문자이어야 합니다.",
- :taken => "이미 사용되고 있습니다.",
- :not_a_number => "숫자가 아닙니다."
- }
- class User < ActiveRecord::Base
- register_attr_name(:username => '아이디', :nickname => '닉네임')
- # ...
- end
이렇게 설정할 경우, <%= error_messages_for :user %> 에서 적절한 한글 메시지를 볼 수 있게 된다.



::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::
좋은 내용감사합니다.
그런데
5, 21 번째 줄 || 이 빠졌네요.
앞으로 자주 들르겠습니다. ^^
아그리고 error_messages_for 호출시
5 errors prohibited this user from being saved
There were problems with the following fields:
이부분 한글화도 가능한가요?
좋은하루되세요.