ActiveSupport::Inflector

目次

試した環境

$ ruby -v
ruby 2.1.0dev (2013-09-22 trunk 43011) [x86_64-darwin12.5.0]
$ bundle exec ruby -r active_support -e 'puts ActiveSupport::VERSION::STRING'
4.0.0

言葉の変化に関連した機能を追加できます。

ActiveSupport::inflector

基本的な変換機能を備えた Inflections クラスとファクトリ .inflections メソッドが定義されている。

.inflections

ActvieSupport::Inflectors::Inflections のインスタンスを作り返す。 locale別にキャッシュされる仕組みなのでこれを経由することで無駄なインスタンスを生成しなくてすみます。 ブロックを渡すことで引数に インスタンスを渡してくれるので設定したい場合などにも利用できます。

ActiveSupport::Inflectors::Inflections

特殊な処理が必要な単語を記録しておき、そうでないは定型処理をする仕組みになっていて、このデータベースの役割をして、そういた単語を登録したりして利用する。登録できる項目は、省略形、複数形、単数形、不可算名刺、人間のよみやすい形式への変換といった項目を追加することになります。

実際に変換する場合は ActiveSupprt::Inflectors::Methods のメソッドを使うことになる。

#acronym

頭文字である単語を登録する。変換した時に大文字が維持される。

require 'active_support/inflector'


include ActiveSupport::Inflector

inflections do |inf|
  p titleize "HTML"      # => "Html"

  inf.acronym "HTML"

  p titleize "HTML"      # => "HTML"
end

#plural

複数形の登録を行います。

#singular

単数形の登録を行います。

#irregular

複数形が people のような person といった特殊な単語を登録します。

#uncountable

money や infomation のような数えられない単語を登録します。

#human

人間によみやすくなるように変換するものを登録します。引数 rule には正規表現を登録可能です。

#clear

データベースを空にします。 scope に@なしのインスタンス名をわたすとそれに対応したものを空にします。

Methods

文字列を別の種類の形に変換するメソッドが実装されています。 ActiveSupport::Inflector::Inflections に登録したデータを利用して変換するものもあります。 メソッドは ActiveSupport::Inflector のモジュールメソッドとして追加されます。 これらのメソッドは String のインスタンスメソッドからもアクセスできます。

この機能のみ利用したい場合は:

require 'active_support/inflector/methods'

とします。

ソースコードはこちら

#pluralize

複数形に変換します。特殊な単語は ActiveSupport::Inflector::Infelctinos のインスタンスに保存されています。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.pluralize "post"    # => "posts"
ActiveSupport::Inflector.pluralize "octopus" # => "octopi"
ActiveSupport::Inflector.pluralize "posts"   # => "posts"

#singularize

単数形に変換します。特殊な単語は ActiveSupport::Inflector::Infelctinos のインスタンスに保存されています。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.singularize "posts"  # => "post"
ActiveSupport::Inflector.singularize "octopi" # => "octopus"
ActiveSupport::Inflector.singularize "post"   # => "post"

#camelize

キャメル形式に変換します。第2引数 uppercase_first_letterfalse を指定すると先頭だけ小文字にすることができます。 変換規則は Rails のクラスの命名規則に沿います。 逆の走査は undersocre ですが、必ずしも元の文字列にもどるとは限りません。

ActiveSupport::Inflector::Inflections の acronyms や acronym_regex によって変換規則を修正可能です。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.camelize "active_model"        # => "ActiveModel"
ActiveSupport::Inflector.camelize "active_model", false # => "activeModel"
ActiveSupport::Inflector.camelize "active_model/errors" # => "ActiveModel::Errors"

#underscore

アンダースコア形式に変換します。Rails のファイル名規則に沿います。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.underscore "ActiveModel"         # => "active_model"
ActiveSupport::Inflector.underscore "ActiveModel::Errors" # => "active_model/errors"

#humanize

人間にやさしい形式に変換します。 先頭の文字を大文字にしたり、 _id を排除したりします。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.humanize "user_id"      # => "User"
ActiveSupport::Inflector.humanize "current_user" # => "Current user"

#titleize

タイトル用の文字列に変換します。 基本的には単語の先頭が大文字になります。

require 'active_support/inflector/methods'

 ActiveSupport::Inflector.titleize "current user" # => "Current User"

#tableize

クラス名をテーブル名に変換します。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.tableize "CurrentUser" # => "current_users"

#classify

テーブル名をクラス名に変換します。 ドットが含まれいるとドットより前の単語は削除されます。 一般的にはデータベース名が含まれている状態だからです。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.classify "current_users"        # => "CurrentUser"
ActiveSupport::Inflector.classify "system.current_users" # => "CurrentUser"

#dasherize

under_score な文字列を dash に変更します。 _- へ置換しているだけでした。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.dasherize "current_user" # => "current-user"

demodulize

モジュール名を削除します。 クラス名の部分を削除する場合は deconstantize メソッドを使用します。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.demodulize "Admin::CurrentUser" # => "CurrentUser"

#deconstantize

モジュール名を含めたクラス名のクラス名を削除します。 クラス名だけを残す場合は `demodulize’ メソッドを使用します。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.deconstantize "Admin::CurrentUser" # => "Admin"
ActiveSupport::Inflector.deconstantize "CurrentUser" # => ""
ActiveSupport::Inflector.deconstantize "::CurrentUser" # => ""

#foreign_key

クラス名を外部キー名に変更します。 第2引数 separate_class_name_and_id_with_underscorefalse 指定すると追記する id に underscore を付属させません。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.foreign_key "User"        # => "user_id"
ActiveSupport::Inflector.foreign_key "User", false # => "userid"
ActiveSupport::Inflector.foreign_key "Admin::User" # => "user_id"

#constantize

文字列を実際の定数が指しているオブジェクトへ変換します。 存在しない定数を指定した場合は NameError が発生します。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.constantize "Module" # => Module

#safe_constantize

例外が発生しない constanitize です。みつからない定数の場合は nil を返します。

#ordinal

数値から 1st, 2nd のような序数形式として接尾語として使う文字列を返します。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.ordinal(1)  # => "st"
ActiveSupport::Inflector.ordinal(2)  # => "nd"
ActiveSupport::Inflector.ordinal(3)  # => "rd"

#ordinalize

数値から 1st, 2nd, 3rd のような序数形式の文字列を返します。

require 'active_support/inflector/methods'

ActiveSupport::Inflector.ordinalize(1)  # => "1st"
ActiveSupport::Inflector.ordinalize(2)  # => "2nd"
ActiveSupport::Inflector.ordinalize(3)  # => "3rd"

Transliterate

非アスキー文字をアスキー文字へ変換する transliterate が実装されている。 そもそもの目的は URL などで使用できる文字列を作成するための `parameterize のためにあるようにも間じる。

#transliterate

非アスキー文字を近いアスキー文字に変換する あまり日本語だと関係ないと思う。

#parameterize

文字列をURLなどに利用するパラメータへ変換するメソッド。 利用できない特殊な文字を含む場合はsepで置き換えがされます。