概要
- ActiveModel::Modelとは
- ApplicationRecordを継承するのだとだめなのか
- 参照
ActiveModelとは
Action PackやAction Viewと連携する機能を使えるようになる。
Railsガイドによると、モデル名の調査、変換、翻訳、バリデーションといった機能が使えるようになるみたいです。
またActive Recordの場合と同じような方法で、オブジェクトを属性のハッシュで初期化することができるようになります。
コードで記述すると
class NameList
include ActiveModel::Model
attr_accessor :name, :email, :prefecture
validates :name, :email, :prefecture
end
name_list = NameList.new(name: "Tarou", email: "tarou@example.com", prefecture: "青森")
name_list.name # => "Tarou"
name_list.email # => "tarou@example.com"
name_list.prefecture # => "青森"
ざっくりな解釈ですが
定義した属性値にバリデーションをかけられて、また属性値をハッシュのキーに持つインスタンスを生成することができるみたい。
ここで一つの疑問が生まれました。
同じような機能をすでに持っているApplicationRecordクラスを継承すればいいのでは?と
ApplicationRecordを継承するのだとだめなのか
結論、フォームを用意しているViewに遷移すると、エラーが起きます。
ActiveRecord::StatementInvalid
Mysql2::Error: Table 'sample_app_development.name_lists' doesn't exis
エラー原因は、モデルに紐づくテーブルが存在しないことによるものだと考えられます。
ApplicationRecordの親である、ActiveRecord::Baseにモデルとテーブルを1対1で紐付ける機能がありそうです。
ActiveModel::Modelをincludeする理由は、機能実装に必要なメソッドの取得を最小限に留めるためだと考えます。
Formオブジェクトを作成するときはデザインパターン通りにコードを記述するのが良さそう。
疑問が浮かべばあえてエラーを起こして原因を探るのも面白そうです。
何か誤りがありましたらご教示いただけると幸いです。
参照
- Railsガイド