読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Rails4でクラス名、DB名、ファイル名の変換

Rails Tips Rails ActiveSupport

Railsの規約を実装するために、クラス名からDB名を取得する、ファイル名を取得するなど文字列を変換する処理がActiveSuportに実装されています。ActiveSupportはStringクラスを拡張する形で、上記の名前を簡単に変換することができます。

動作確認

  • Rails 4.1
  • ActiveSupport 4.1.7

目次

  1. 単数形から複数形にする(pluralize)
  2. 複数形から単数形にする(singularize)
  3. クラス名からファイル名へ変換する(underscore)
  4. ファイル名からクラス名へ変換する(camelcase)
  5. モデルクラス名からテーブル名へ変換する(tableize)
  6. テーブル名からモデルクラス名へ変換する(classify)
  7. クラス名からクラスオブジェクトを取得する(constantize)

1. 単数形から複数形にする(pluralize)

Stringクラスのpluralizeメソッドは、単数形を複数形にします。

# 単数形を複数形に変換する
"post".pluralize     #=> "posts"
"the post".pluralize #=> "the posts"

# 複数形のものはそのまま
"posts".pluralize #=> "posts"

# 不規則変換も変換してくれる
"person".pluralize # => "people"

# 日本語は変な風に変換されてしまうので注意が必要
"あいう".pluralize => "あいうs"
# ロケールを指定すれば変換されない
"あいう".pluralize(locale = :ja) #=> "あいう"


2. 複数形から単数形にする(singularize)

Stringクラスのsingularizeメソッドは複数形を単数形にします。

# 複数形を単数形に変換する
"posts".singularize    #=> "post"
"the post".singularize #=> "the post"

# 単数形のものはそのまま
"post".singularize #=> "post"

# 不規則変換も変換してくれる
"people".singularize #=> "person"


3. クラス名からファイル名へ変換する(underscore)

Railsでは、

  • クラス名は、キャメルケース(例: UsersControlerUser)
  • ファイル名は、スネークケース(例:users_controller.rbuser.rb)

です。
Stringクラスのunderscoreメソッドでスネークケースにします。

"UsersControlller".underscore         #=> "users_controlller"
"#{"UsersControlller".underscore}.rb" #=> "users_controlller.rb"

"User".underscore          #=> "user"
"User".underscore << ".rb" #=> "user.rb"

# :: は / に変換してくれる
"ActiveModel::Errors".underscore #=> "active_model/errors"


4. ファイル名からクラス名へ変換する(camelcase)

Railsでは、

  • ファイル名は、スネークケース(例:users_controller.rbuser.rb)
  • クラス名は、キャメルケース(例: UsersControlerUser)

です。

Stringクラスのcamelcaseメソッドでキャメルケースにします。

"users_controller".camelcase    #=> "UsersController"
"users_controller.rb".camelcase #=> "UsersController.rb"

"user".camelcase #=> "User"

# / は :: に変換してくれる
"active_model/errors".camelcase #=> "ActiveModel::Errors"


5. モデルクラス名からテーブル名へ変換する(tableize)

テーブル名は、ActiveModel::Baseを継承したモデルクラスのクラス名(例: UserLineItem)のスネークケースの複数形である必要があります。(例: usersline_items)

Stringクラスのtableizeメソッドでモデル名をテーブル名へ変換します。

"User".tableize     #=> "users"
"LineItem".tableize #=> "line_items"


6. テーブル名からモデルクラス名へ変換する(classify)

Stringクラスのclassifyメソッドでテーブル名をモデルクラス名へ変換します。

"users".classify      #=> "User"
"line_items".classify #=> "LineItem"


7. クラス名からクラスオブジェクトを取得する(constantize)

Stringクラスのconstantizeメソッドでクラス名からクラスオブジェクトを取得します。

"User".constantize            #=> User
"UsersController".constantize #=> UsersController

# newなどをチェインさせれば、オブジェクトを作成できる
"User".constantize.new
#=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>

# 存在しないクラスをconstantizeするとNameError例外が発生する
"Hoge".constantize #=> NameError: uninitialized constant Hoge


config/initializers/inflections.rbに変換ルールを定義できる。

以上です。

参考文献