[Ruby on Rails 4] 1対多のリレーションモデルと入れ子フォームの実装のポイント

関連付け、バリデーション、フォームまわり。

関連付け

has_many:dependent オプション

  • has_many:dependent オプションは、「関連」するモデルオブジェクトを削除する。
    • :destroy を値として渡すと、全ての「関連」するオブジェクトも「destroy」メソッドを呼び削除する。
    • :delete_all を値に渡すと、「コールバック」なしで「関連」するオブジェクトのレコードにSQLのDELETE文を実行する。

バリデーション

親から子を削除するときに、子の個数が残っている事をバリデーションしたい。
削除後にいくつ残るかは marked_for_destruction? で取得できた。

StrongParameters

attr_accessible から StrongParameters に変わった。
ホワイトリスト形式。

Nested Model Forms

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 を設定することでバリデーションの範囲を限定できる。

入力項目の動的な追加・削除機能

  • Rails で提供されていないので Ajax で作成する。

補遺