
背景
久しぶりにFormオブジェクトを実装することになりました。いろいろ忘れてしまっていたので、実装に時間がかかってしまいました…次からスムーズにいくようここにまとめておきます。
実装方法
ファイルのパス
ファイルは今までの経験だと app/forms 配下に置くのが一般的となっています。autload_pathsに含まれていれば良いかなと思います。
autoload_pathsについてはこちらを参考にしてください。
必要なクラスのinclude
validationなどを実現するために、クラスをincludeします。
今回はActiveModel::Modelをincludeします。
こちらにあるように、ActiveModel::Modelをincludeすると以下のようなことができるようになります。
- バリデーション
- ハッシュでの初期化
- form_forの利用
この3つはフォームを実装する上で必須の機能になります。
バリデーション
フォームで送信された値の妥当性をチェックするのに必要です。valid?メソッドを呼び出すことによって、設定したバリデーションを呼び出すことができます。
ハッシュでの初期化
実装したフォームオブジェクトはコントローラで利用します。ハッシュで初期化できるということは、StrongParametersをそのまま渡すことができます。
こちらに記載の例を少し変更して
1 | class PeopleController < ActionController::Base |
とすることができます。
form_forの利用
viewでフォームを作成する際はform_forを使うと便利です。上記の例を使うと
1 | <% form_for @person, url: person_create_path do |f| %> |
という感じになります。
ここまででほとんど実装できましたね。
翻訳
翻訳はactivemodelをキーにして定義します。
エラーメッセージなどは翻訳させないと項目名がそのまま表示されてしまいます。
まとめ
フォームオブジェクトの作り方をまとめました。ActiveModel::Modelモジュールがとても便利ということですね。
バリデーション、Strong Parameters、form_forを覚えておけばスムーズに実装できると思います。
余談ですが、利用規約の同意などでチェックボックスを使うことがあると思いますが、check_boxのバリデーションは acceptanceです。
validates :agreement, acceptance: { message: '利用規約に同意してください' }
という形式です。presenceではチェックしてなくてもバリデーション通ってしまいます…
※追記 こちらとてもよくまとまっています
https://thoughtbot.com/blog/activemodel-form-objects