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: メールアドレス