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
で受け取って出力しています。初見では何をしているのかわからなかったのですが、正規表現のキャプチャを使用しています。
- 作者: 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
変換が不規則な処理を定義します。ここに定義することでsingularize
とpluralize
のそれぞれで変換が行われます。
`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アプリケーションプログラミング
- 作者: 山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2017/04/14
- メディア: 大型本
- この商品を含むブログを見る