[Ruby on Rails 4] 1対多のリレーションモデルと入れ子フォームの実装のポイント
関連付け、バリデーション、フォームまわり。
Contents
関連付け
- Active Record の関連付け (アソシエーション) | Rails ガイド
- Rails4で1対多のリレーションをモデルに実装する – Rails Webook
- 開発現場でちゃんと使えるRails 4入門(6):ActiveRecordにおけるモデルの「関連」とコールバックの使い方 (1/3) – @IT
has_many
の :dependent
オプション
has_many
の:dependent
オプションは、「関連」するモデルオブジェクトを削除する。:destroy
を値として渡すと、全ての「関連」するオブジェクトも「destroy」メソッドを呼び削除する。:delete_all
を値に渡すと、「コールバック」なしで「関連」するオブジェクトのレコードにSQLのDELETE文を実行する。
バリデーション
- Active Record バリデーション | Rails ガイド
- 検証(validation) – – Railsドキュメント
- Rails 4でモデルのバリデーションまとめ – Rails Webook
親から子を削除するときに、子の個数が残っている事をバリデーションしたい。
削除後にいくつ残るかは marked_for_destruction? で取得できた。
StrongParameters
attr_accessible から StrongParameters に変わった。
ホワイトリスト形式。
Nested Model Forms
- Rails 複数の子レコードの作成・更新を自在に扱う (accepts_nested_attributes_for) – Qiita
- Railsでaccepts_nested_attributes_forとfields_forを使ってhas_many関連の子レコードを作成/更新するフォームを作成 – Rails Webook
Rails 3 についてだけれども分かりやすい。
作成機能
- 親 Model に
accepts_nested_attributes_for
を追加する。 - 親 View に
fields_for
で入れ子フォームを表示できる。fields_for
は[引数に与えた名前]_attributes
という name 属性でフォームを作成する。
- 親 Controller の StrongParameter で
[引数に与えた名前]_attributes
を許可する。
削除機能
- 親 Model に
allow_destroy: true
を追加する。 - 親 View の削除チェックボックスのキーを
_destroy
とする。 - 親 Controller の StrongParameter で
_destroy
を許可する。
バリデーション
- Model に
validates
を設定する。- 子 Model の作成が必須でない場合、親 Model で
reject_if
を設定することでバリデーションの範囲を限定できる。
- 子 Model の作成が必須でない場合、親 Model で
入力項目の動的な追加・削除機能
- Rails で提供されていないので Ajax で作成する。