はじめに
今回は、1つのフォームから複数のテーブルに情報を保存するFormオブジェクトの実装について簡単に復習していこうと思います。
Formオブジェクトパターンでの実装方法
Formオブジェクトの前提
Railsでの開発では、ルーティングやコントローラー、モデルを扱って開発を進めていきます。
これらは、Railsによって最初に用意されているものであったり、Railsのコマンドを使って自動で生成したりするものです!
しかし、実は、Railsではこの様なルールに則ったRubyファイル以外のRubyファイルを自作して活用することが可能です!
今回復習するFormオブジェクトもこの様な公式が用意してくれたものではありません。
しかし、RubyやRailsの仕組みを理解していけば、自分でクラスを生成し、便利なプログラムを組むことができます!
アプリケーションを開発する時にはある程度良いとされている手順・方法があります!
この様な手順・方法をデザインパターンと言います!
デザインパターンとは
デザインパターンとは、こんなプログラムにしたいという要望に対して最適な方法や手順をまとめたもののことです!
また、デザインパターンは様々な粒度で捉えることができます!
Formオブジェクトの目的は、1つのフォームから複数のテーブルにデータを保存するというものです!
これには、バリデーションやエラーメッセージの表示ができないという問題が普通に実装すれば起こります。
これを解決するためのデザインパターンのことをFormオブジェクトパターンと言います!
Formオブジェクトパターン
Formオブジェクトパターンとは、Railsを利用する開発における実装パターンのことです!
このデザインパターンでは、1つのフォーム送信で複数のモデルを操作したい場合や、テーブルに情報を保存しない情報に対するバリデーションを行いたい場合に使います!
手順は以下の様になります!
- 新たにmodelディレクトリ直下にファイルを作成し、クラスを定義する
- 作成したクラスにform_withメソッドに対応する機能とバリデーションを行う機能を持たせる
- 保存したい複数のテーブルのカラム名全てを軸精緻として扱う様にする
- バリデーションの処理をかく
- データをテーブルに保存する処理を書く
- コントローラーのnewアクション、createアクションでFormオブジェクトのインスタンスを生成するようにする
- フォーム作成の部分をFormオブジェクトのインスタンスを因数として渡す形に変更する
ActiveModel::Model
あるクラスにActiveModel::Modelをincludeすると、そのクラスのインスタンスはActiveRecordを継承したクラスのインスタンスと同じ様にform_withやrenderなどのヘルパーメソッドの引数として扱えたり、バリデーションの機能を使える様になります!
また、Formオブジェクトパターンを実装するためにActiveModel::ModelをincludeしたクラスのことをFormオブジェクトと呼ぶこともあります!
コメント