1
4

More than 3 years have passed since last update.

Formオブジェクトについて

Last updated at Posted at 2020-11-26

Formオブジェクトとは?

 1つのフォーム送信で複数のモデルを操作したい場合や、テーブルに情報を保存しない情報に対するバリデーションを行いたい場合使うデザインパターンのこと。

実装手順

① 新たにformオブジェクト用のmedelを作成する

ターミナル
% rails g model モデル名

② form_withメソッドに対する機能とバリデーションを行う機能を持たせる。

test_form.rb
class TestForm

  include ActiveModel::Model

◯ include ActiveModel::Model
 この記述のように、ActiveModel::Modelをincludeすることで、form_withやrenderなどのヘルパーメソッドの引数として扱えたり、バリデーションの機能が使用できるようになる。
 この記述は「Formオブジェクト」を呼ばれる。

③ 保存したい複数のテーブルのカラム名全てを属性値として扱えるようにする。

test_form.rb
class TestForm

  include ActiveModel::Model
  attr_accessor :カラム名1, :カラム名2, ・・・

◯attr_accessor
 ゲッターとセッターを定義してくれるメソッド。与えられた引数をもとに属性を設定し、これを取得するメソッド(ゲッター)と更新するメソッド(セッター)を定義することができる。
 モデルに対応するテーブルのカラム名以外の属性を扱いたい場合は、attr_accessorを用いて追加する。

④ バリデーションを設定する。

test_form.rb
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オブジェクトに記述する。
 理由としては、バリデーションが引っかかった場合に、各モデルにバリデーションを記述していると、引っかかった理由をうまく画面に表示できなくなるため。

⑤ データをテーブルに保存する処理を書く。

test_form.rb
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を保存したいモデルに記述する。

1
4
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
1
4