0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Formオブジェクトを作成するために、ActiveModel::Modelをincludeする理由

Last updated at Posted at 2021-01-10

概要

  • ActiveModel::Modelとは
  • ApplicationRecordを継承するのだとだめなのか
  • 参照

ActiveModelとは

Action PackやAction Viewと連携する機能を使えるようになる。

Railsガイドによると、モデル名の調査、変換、翻訳、バリデーションといった機能が使えるようになるみたいです。
またActive Recordの場合と同じような方法で、オブジェクトを属性のハッシュで初期化することができるようになります。

コードで記述すると

model
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ガイド
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?