Railsで単語の単数・複数変換を制御する

Railsでは単語の単数・複数をsingularize/pluralizeで変換することができますが、変換を行いたくないときもあります。そのようなときにはinflections.rbへ設定を追加することで変換を制御することができます。

Railsのバージョン

$ bundle list | grep rails 
  * rails (4.2.7)

config/initializers/inflections.rb

config/initializers/inflections.rbにはあらかじめ以下のコメントが記述されています。

# Be sure to restart your server when you modify this file.

# Add new inflection rules using the following format. Inflections
# are locale specific, and you may define rules for as many different
# locales as you wish. All of these examples are active by default:
 ActiveSupport::Inflector.inflections(:en) do |inflect|
#   inflect.plural /^(ox)$/i, '\1en'
#   inflect.singular /^(ox)en/i, '\1'
#   inflect.irregular 'person', 'people'
 #   inflect.uncountable %w( fish sheep )
 end

# These inflection rules are supported but not enabled by default:
# ActiveSupport::Inflector.inflections(:en) do |inflect|
#   inflect.acronym 'RESTful'
# end

それぞれの項目は以下のとおりとなっています。

  • pluralは複数形への変換を定義
  • singularは単数形への変換を定義
  • irregularは単数形と複数形で規則性がない変換を定義
  • uncountableは孵化産名刺を定義

plural

複数形への変換処理を定義します。ここで定義することによりplularize実行時に変換規則が適用されます。

`config/initializers/inflections.rb`
 inflect.plural /^(ox)$/i, '\1en'

>> 'ox'.pluralize
"oxen"
>> 'oX'.pluralize
"oXen"

inflect.plural /^(ox)$/i, '\1en'について

inflect.plural /^(ox)$/i, '\1en'は、以下の通り記述する必要があります。

inflect.plural {単数形のパターン} {複数形の出力内容}

このとき、/^(ox)$/i, '\1en'は単数形のパターンにマッチした文字列を複数形の出力内容に定義している1で受け取って出力しています。初見では何をしているのかわからなかったのですが、正規表現のキャプチャを使用しています。

詳説 正規表現 第3版

詳説 正規表現 第3版

  • 作者: Jeffrey E.F. Friedl,株式会社ロングテール,長尾高弘
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2008/04/26
  • メディア: 大型本
  • 購入: 24人 クリック: 754回
  • この商品を含むブログ (87件) を見る

詳説 正規表現 P.132 3.4.5.1 キャプチャーしグループ化する括弧を参照

singular

単数形への変換処理を定義します。ここで定義することによりsingularize実行時に変換規則が適用されます。

`config/initializers/inflections.rb`
  inflect.singular /^(ox)en/i, '\1'

>> 'oxen'.singularize
"ox"
>> 'oXen'.singularize
"oX"

irregular

変換が不規則な処理を定義します。ここに定義することでsingularizepluralizeのそれぞれで変換が行われます。

`config/initializers/inflections.rb`
 inflect.irregular 'person', 'people'

>> 'people'.singularize
"person"
>> 'person'.pluralize
"people"

inflect.irregularについて

inflect.irregularは以下の通り定義する必要があります。

 inflect.irregular {単数形の文字列}, {複数形の文字列}

ここで定義できる引数は正規表現は指定することはできず文字列だけを定義することができます。

uncountable

uncountableには不可算名詞を定義します。ここに定義することでsingularize/pluralizeの結果が同一のものとなります。

`config/initializers/inflections.rb`
 inflect.uncountable %w( fish )

>> 'fish'.singularize
"fish"
>> 'fish'.pluralize
"fish"

おわりに

今回はenumで定義した値をuncountableに定義したかっただけだったのですが、調べていくといろいろと面白かったです。昔のプロジェクトで税をtaxとしたときにいろいろとこんがらがったことがあったことを思い出しました。

Ruby on Rails 5アプリケーションプログラミング

Ruby on Rails 5アプリケーションプログラミング