ActiveSupportのString拡張(活用形)まとめ



詳しくは [Rails Guides: Active Support コア拡張機能](http://railsguides.jp/active_support_core_extensions.html#活用形) に書いてありますが、簡単にまとめたものがほしかったので適当に抜き出してまとめてみました。

## pluralize

レシーバを「複数形」にしたものを返します。

```ruby
"table".pluralize     # => "tables"
"ruby".pluralize      # => "rubies"
"equipment".pluralize # => "equipment"

"dude".pluralize      # => "dudes"
"dude".pluralize(0)   # => "dudes"
"dude".pluralize(1)   # => "dude"
"dude".pluralize(2)   # => "dudes"
```

## singularize

レシーバを「単数形」にしたものを返します。
pluralizeと逆の動作です。

```ruby
"tables".singularize    # => "table"
"rubies".singularize    # => "ruby"
"equipment".singularize # => "equipment"
```

## camelize(camelcase)

レシーバをキャメルケース (冒頭を大文字にした単語をスペースなしで連結した語) にしたものを返します。
"/"は"::"に変換されます。

```ruby
"product".camelize               # => "Product"
"admin_user".camelize            # => "AdminUser"
"backoffice/session".camelize    # => "Backoffice::Session"
"visual_effect".camelize(:lower) # => "visualEffect"
```

## underscore

キャメルケースをパスに変換します。
"::"は"/"に変換されます。

```ruby
"Product".underscore             # => "product"
"AdminUser".underscore           # => "admin_user"
"Backoffice::Session".underscore # => "backoffice/session"
"visualEffect".underscore        # => "visual_effect"
```

## titleize(titlecase)

レシーバの語の1文字目を大文字にします。

```ruby
"alice in wonderland".titleize # => "Alice In Wonderland"
"fermat's enigma".titleize     # => "Fermat's Enigma"
```

## dasherize

レシーバのアンダースコア文字をダッシュに置き換えます

```ruby
"name".dasherize         # => "name"
"contact_data".dasherize # => "contact-data"
```

## demodulize

フルパスの (qualified) 定数名を与えられると、パス部分を取り除いて右側の定数名だけにしたものを返します。

```ruby
"Product".demodulize                        # => "Product"
"Backoffice::UsersController".demodulize    # => "UsersController"
"Admin::Hotel::ReservationUtils".demodulize # => "ReservationUtils"
"::Inflections".demodulize                  # => "Inflections"
"".demodulize                               # => ""
```

## deconstantize

フルパスの定数を表す参照表現を与えられると、一番右の部分 (通常は定数名) を取り除きます。

```ruby
"Product".deconstantize                        # => ""
"Backoffice::UsersController".deconstantize    # => "Backoffice"
"Admin::Hotel::ReservationUtils".deconstantize # => "Admin::Hotel"
```

## parameterize

レシーバを正しいURLで使用可能な形式に正規化します。

```ruby
"John Smith".parameterize # => "john-smith"
"Kurt Gödel".parameterize # => "kurt-godel"
```

## tableize

underscoreの次にpluralizeを実行したものです。
モデル名にtableizeを使用するとモデルのテーブル名を得られます。

```ruby
"Person".tableize      # => "people"
"Invoice".tableize     # => "invoices"
"InvoiceLine".tableize # => "invoice_lines"
```

## classify

与えられたテーブル名に対応するクラス名を返します。

```ruby
"people".classify                        # => "Person"
"invoices".classify                      # => "Invoice"
"invoice_lines".classify                 # => "InvoiceLine"
"highrise_production.companies".classify # => "Company"
```

classifyが返すクラス名は文字列であることにご注意ください。
得られた文字列に対してconstantizeを実行することで本当のクラスオブジェクトを得られます。

## constantize

レシーバの定数参照表現を解決し、実際のオブジェクトを返します。

```ruby
"Fixnum".constantize # => Fixnum
```

## humanize

属性名を (英語的に) 読みやすい表記に変換します。

具体的には以下の変換を行います。

* 引数に (英語の) 活用ルールを適用します(inflection)。
* 冒頭にアンダースコアがある場合は削除します。
* 末尾に"_id"がある場合は削除します。
* アンダースコアが他にもある場合はスペースに置き換えます。
* 略語を除いてすべての単語を小文字にします(downcase)。
* 最初の単語だけ冒頭の文字を大文字にします(capitalize)。

```ruby
"name".humanize                         # => "Name"
"author_id".humanize                    # => "Author"
"author_id".humanize(capitalize: false) # => "author"
"comments_count".humanize               # => "Comments count"
"_id".humanize                          # => "Id"
```

## foreign_key

クラス名から外部キーカラム名を求める時に使用します。
具体的には、demodulize、underscoreを実行し、末尾に "_id" を追加します。

```ruby
"User".foreign_key           # => "user_id"
"InvoiceLine".foreign_key    # => "invoice_line_id"
"Admin::Session".foreign_key # => "session_id"
"User".foreign_key(false)    # => "userid"
```