複数のモデルを1アクションで扱う

最近の自分の中での課題はもっぱら↑についてです。


Railsの作りから察するに、1アクション=1モデルが原則なんだろうけど
そんなんどんなゆとりアプリだt(ry


RailscastsのFormのところに載ってる、Complex Forms Part 1-3みたいに
かっこよくやってもいいんだけど、(いややりたくでもできないんですがね!)
これバリデーションのエラーメッセージどうやって取ってるんだろう。
参考:#73 Complex Forms Part 1 - RailsCasts


目標としては、

  • すべての必要な項目に対して検証を行い、適切なメッセージを出力する。
  • 当然ながら不正なデータは作成しない。(親だけinsertされてるとか)
  • カスケードが効くっぽいので、できるだけ使いたい。(オブジェクト間で関連づけを行い、最後にがつっと親をsaveする)


そこで僕がいきついたのが、ActiveFormでいいんじゃね?ということ
StrutsのActionFormみたいに、リクエスト取得、再現のためのModelを作成する。


@form = Form.new(param[:form]) みたいな感じでリクエストを取得して(FormはActiveFormを継承している)
@form.valid?を行い →ここでfalseだったらエラー表示
そのあと、各モデルへ詰め替え、関連づけを行う。
最後にそれぞれをsave 


みたいな感じ。


欠点は

  • Formクラスに、画面から受け取る変数をすべて定義しておかなきゃいけないこと。(attr_accessorごにょごにょ…といった感じで)
  • form_forに渡すインスタンスがFormクラスになるため、map.resourcesを変更するか、view側でアクション先を明示的に指定しなきゃいけないこと。
  • 単純に、詰め替え作業がカッコよくない。


まだ新規作成画面しかできてないから、問題が出る可能性もあるけど
かっこよさ<可読性(理解のしやすさ) じゃないかな! と言って逃げてみる。


実際みなさんどうしてるんでしょうか。

  • 追記:変更画面作ってるけど、駄目かもしれない・・・。ボツになる可能性大!
  • 追記2:できないわけがなかった!だけど微妙だなぁ。メインのModelにセッター作る方法も試してみるかなぁ。