ActiveModel::Model で簡単に ActiveModel の機能を利用する

例えばユーザからの問い合わせを受け付けるメールフォームなど、特にデータベースに値を保存したりする必要はないが ActiveModel の機能は使いたいケースで Rails 4 では ActiveModel::Model をインクルードする事で簡単に処理できます。

class MailForm
  include ActiveModel::Model

  attr_accessor :name, :email # 属性はこのように定義する
end

同じような事を Rails 3 で行う場合に次のような記述をした事があるのですが、これと比較するとかなりすっきりしています。

class MailForm
  include ActiveModel::Conversion
  include ActiveModel::Validations
  include ActiveModel::Validations::Callbacks
  extend ActiveModel::Naming
  extend ActiveModel::Translation

  attr_accessor :name, :email

  def attributes=(params)
    params.each do |k, v|
      send("#{k}=", v.html_safe)
    end
  end

もちろんバリデーションもそのまま使えます。

class MailForm
  include ActiveModel::Model

  attr_accessor :name, :email # 属性はこのように定義する

  validates :name,  presence: true
end

なお API はこちら。

http://api.rubyonrails.org/classes/ActiveModel/Model.html

これによると ActiveModel::Model にインクルードされているのは ActiveModel::Validations と ActiveModel::Conversion との事ですが i18n_generators を用いた i18n にも対応しています。
ただし日本語化する時に config/locales/translation_ja.yml で次のように指定してもうまく翻訳されません。

ja:
  activerecord:
    models:
      mail_form: メールフォーム

  attributes:
    mail_form:
      name: 名前
      email: メールアドレス

以下のように指定すると翻訳が行われるようになります。

  activemodel:
    models:
      mail_form: メールフォーム

  attributes:
    mail_form:
      name: 名前
      email: メールアドレス