i18n, enum을 이용하여 formfor의 f.select를 일본어화

구현하고 싶었던 것 enum과 f.select의 병용



한 번 만든 기능을 리팩토링하고 있습니다만, 풀다운으로 항목을 선택하고 post한다는 동작 중에서
내용이 기분 나쁜 곳이 있었으므로 수정. 모델은 book입니다.

schema.rb
t.category "string"

new.html.erb
<%= f.select :category, [["男向け", "男向け"], ["女向け", "女向け"], ["その他", "その他"]] %>



당초는 이런 느낌으로 쓰고 있었습니다만, 이것이라면 데이터베이스에 문자열의 데이터가 직접 들어가기 때문에 별로 좋지 않습니다.
그래서 enum을 이용하여 데이터베이스에는 수치가 들어가도록 했습니다.
category는 물론 integer형으로 합니다.

필요한 기술



여기에서는 구현에 필요한 기술을 나열합니다.

enum



유명한 enum 이군요.
컬럼 안의 항목에 정수를 할당해, 메소드를 간단하게 실행할 수 있게 되거나, 가독성을 올릴 수 있게 되거나 합니다.
이 기사 참고로 했습니다.

【Rails 입문】enum의 사용법 정리

이번에는 enum

book.rb
enum category:{for_men: 0, for_women: 1, for_others: 2}

이런 느낌으로 세트합니다.

그리고 enum을 쉽게 일본어화할 수 있도록 도움 gem을 넣습니다.
enum_help라는 gem입니다.

ruby.rb
#gemfile

gem 'enum_help'


bundle하자.

YAML



둘째, yaml입니다.
yaml은 계층화된 데이터를 쓰기 쉽게 해주는 표기 방법입니다.

참고 기사 : YAML이란? - 항상 Rails 설정 파일에서 나오는 녀석의 정체

rails5에서는 config/locales 아래에 ja.yml이라는 파일을 만듭니다.
이 ja.yml 파일 안에 이 영어 표기는 일본어로 이렇게 표현하겠다는 것을 가르쳐 줍니다.
구체적으로는 아래와 같이 씁니다.

ko.yml

ja:
  activerecord:
   #(この辺に他の設定値がある)
  enums:
    book:
      category:
        for_men: 男向け
        for_women: 女向け
        for_others: その他

f. 세 CT



이것은 가장 먼저 작성되었지만 rails가 제공하는 form_for 중에서 풀다운에서 항목을 선택할 수 있습니다.

【개발 메모】Ruby on Rails의 form_for에서 드롭 다운 목록의 선택 상자를 설치하는 방법
이 기사를 매번 참고로하고 있습니다.

ruby.html.erb
<%= f.select カラム名, [["表示する文字”, "データベースに登録する値”], ["表示する文字”, "データベースに登録する値”]] %>

최종 코드



마지막으로 어떤 코드를 쓰면 구현할 수 있었는지도 써 둡니다.

new.html.erb
<%= f.select :category, Book.categories.keys.map {|k| [I18n.t("enums.book.category.#{k}"), k]} %>

첫째, Book.categories에서
{"for_men"=>0, "for_women"=>1, "for_others"=>2}라는 해시를 사용할 수 있습니다.
keys로 그 중의 키의 부분(해시의 좌측)을 배열로 꺼내, map보다 왼쪽안에 있는 k에 넣어 갑니다.
그 다음에 있는 I18n.t입니다만, 이것은 ja.yml의 표기대로 번역해 준다고 하는 메소드입니다.
t 뒤의 ()내에서 어느 계층에 있는 것인가라는 것을 명기하고 있습니다.

(여기 상당히 빠진 곳에서, 제대로 계층을 명기해 주지 않으면 안됩니다!)
이번에는 enum아래에 있는, book아래에 있는,category아래에 있는 for_men을 번역하라는 명령이 됩니다.
물론 반복하므로 for_women과 for_others도 번역되어 갑니다.

I18n.t의 왼쪽 옆과 k의 오른쪽 옆에 []가 있지만 이것이 f.select의 [] 부분입니다.

또 다른 중요한 일이 있고, 데이터베이스에는 수치가 수치가 들어갑니다만, post 하는 파라미터는 Book.categories 의 키의 부분입니다.
검증으로 보면 빠르지만 form은 이렇게 됩니다.



value는 수치가 아닐까! 라고 생각합니다만, 이러한 사양이라고 합니다.
처음 여기를 0이라고 하면(자), '0'is not a valid category라고 말해져 에러가 되었습니다.

여러가지 함정이 둘러싸여 있는 실장입니다만, 도움이 되면 다행입니다.

좋은 웹페이지 즐겨찾기