enum_helpを利用して列挙型のi18n対応を簡単に行う
はじめに
Railsでアプリケーションを開発する際に、enumを利用しないことはないと思います。そうなると必要になってくるのが、enumとして定義された値のi18n対応です。これをサクッと解決してくれるのが、enum_helpというgemです。
この手の「書こうと思えば書けるけれど、わざわざ書くのも面倒臭い」的な処理が、気づけばgemとして公開されているのが、ruby界隈の文化の素晴らしいところだと思います。ありがたく使わせて頂きましょう。
実装
インストールは以下の通りです。
gem install 'enum_help'
リポジトリを確認すると、一年ほど更新されておりません。READMEにはRails 4.1.0なる文字も目に入ります。ですが、Rails5.xでも普通に動きます。私の手元でも、これといって問題なく商用稼働しているので、当面は差し支えないと考えております。
利用の仕方は非常に簡単です。
以下の通り、対象のattributesに_i18nを付与するだけです。
irb(main):001:0> post = Post.first
Post Load (0.5ms) SELECT `posts`.* FROM `posts` ORDER BY `posts`.`id` ASC LIMIT 1
=> #
irb(main):002:0> post.status_i18n
=> "Draft"
また、上記を複数形にて利用することで、一覧を取得することができます。これはselect formのcollectionの入力として非常に便利です。
irb(main):003:0> Post.statuses_i18n
=> {"rejected"=>"Rejected", "draft"=>"Draft", "published"=>"Published", "other"=>"Other"}
尚、ransackを経由して利用する場合は、別途ransackのransackerオプションにて、symbolから数値への変換を行います。
これはMySQLに渡す検索クエリをenumの文字列表現から、データベース中で保存されている数値表現に変更する必要があるためです。