複数のモデルを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にセッター作る方法も試してみるかなぁ。