Formオブジェクトとは?
1つのフォーム送信で複数のモデルを操作したい場合や、テーブルに情報を保存しない情報に対するバリデーションを行いたい場合使うデザインパターンのこと。
実装手順
####① 新たにformオブジェクト用のmedelを作成する
% rails g model モデル名
####② form_withメソッドに対する機能とバリデーションを行う機能を持たせる。
class TestForm
include ActiveModel::Model
◯ include ActiveModel::Model
この記述のように、ActiveModel::Modelをincludeすることで、form_withやrenderなどのヘルパーメソッドの引数として扱えたり、バリデーションの機能が使用できるようになる。
この記述は「Formオブジェクト」を呼ばれる。
####③ 保存したい複数のテーブルのカラム名全てを属性値として扱えるようにする。
class TestForm
include ActiveModel::Model
attr_accessor :カラム名1, :カラム名2, ・・・
◯attr_accessor
ゲッターとセッターを定義してくれるメソッド。与えられた引数をもとに属性を設定し、これを取得するメソッド(ゲッター)と更新するメソッド(セッター)を定義することができる。
モデルに対応するテーブルのカラム名以外の属性を扱いたい場合は、attr_accessorを用いて追加する。
####④ バリデーションを設定する。
class TestForm
include ActiveModel::Model
attr_accessor :カラム名1, :カラム名2, ・・・
validates :カラム名1, 各オプション
validates :カラム名2, 各オプション
or
with_options 各オプション do
validates :カラム名1
valitates :カラム名2
end
◯with_options
同じオプションがある場合は、with_optionsを使用することで、validatesをまとめることができる。
formオブジェクトで使用するモデルのバリデーションは、各モデルにバリデーションを記述するのではなく、formオブジェクトに記述する。
理由としては、バリデーションが引っかかった場合に、各モデルにバリデーションを記述していると、引っかかった理由をうまく画面に表示できなくなるため。
####⑤ データをテーブルに保存する処理を書く。
class TestForm
include ActiveModel::Model
attr_accessor :カラム名1, :カラム名2, ・・・
validates :カラム名1, 各オプション
validates :カラム名2, 各オプション
or
with_options 各オプション do
validates :カラム名1
valitates :カラム名2
end
def save
変数 = 外部のモデル名.create(カラム名1: 保存したい値, カラム名2: 保存したい値, ・・・)
モデル名1.create(カラム名1: 保存したい値, カラム名2: 保存したい値, ・・・, カラム名: 変数.id)
モデル名2.create(カラム名1: 保存したい値, カラム名2: 保存したい値, ・・・, カラム名: 変数.id)
)
end
保存したい複数のモデルに外部モデルに関するidを保存したい場合は、変数に外部モデルの情報を代入して、その変数のidを保存したいモデルに記述する。