構造をデザインパターンとして採用することが多いです。Aloneでは、MVCを強制はしませんが、積極的にサポートはするというスタンスです。セッションの項で説明したとおり、この場合もリクエストをまたいでモデルが存在しなければなりませんが、モデルの内部状態の保存にはセッションが使われるケースは少なくRDBMS等に保存するケースが多くなります。ここでは、簡単な住所録アプリを作る事を例にして、MVCとCRUD、双方の実装の仕方を説明します。最初は簡単のため、入力できる項目は「名前」と「住所」の2つにします。画面遷移は、以下の通りに設計しました。worldをベースにしてみます。リスト表示の時ややこしいので、READMEファイルは削除しておいてください。READMEコントローラ名を、変更します。併せてrequireを以下の通り修正してください。操作としてCRUDの機能を持つよう設計します。いうデータの永続化機構があり、CRUDを備えているのでそれを継承することにします。endend簡単のため、RDBMSではなく、単純なファイルを保存先にするAlPersistFileを使います。コンストラクタでファイル名を指定し、データの保存先を明らかにします。モデルにCRUDの機能が必要なだけなら、コードはこれだけです。ほかは、AlPersistクラスから継承されます。モデルのテストたとえば、createを試してみましょう。endこのアクションを実行し、画面にtrueと表示されれば成功です。でき、データをエンコードした行が保存されています。入力フォームを表示、及び入力された値を受け取るために、フォームオブジェクトを作ります。今回は、名前と住所の2つのテキスト入力が必要です。名前は必須入力としておきます。加えて以下の2アイテムを追加します。フォームの自動生成を使いたいので、決定ボタンを追加。データを特定するためのIDが必要となるので、それを持ち回るためのIDを非表示で追加。%>これで入力フォームが表示されます。リスト(一覧)表示このアドレス帳の最初の表示はリスト(一覧)表示ですので、それを実装しましょう。コントローラでは、モデルに全件を得るよう指示します。得たデータは@alldataへ入れます。endテンプレートでは、@alldataに入っている全件データをeachで1件ずつ取り出し、テーブルを使って表示します。%>実行結果この例では、モデルのcreateテストで使ったデータが1件のみ表示されています。URLへは、データを特定するためのIDを追加するとともに、各操作とも以下の通り2段階の動作となるので、それぞれアクション名をわかるようにつけます。アクションを定義します。空のフォームを表示すれば良いので、簡単です。モデルオブジェクトを生成し、createする。リダイレクトを使って、デフォルト(リスト表示)へ戻る。使うので、IDは自動採番となり、ブラウザから送られてきたデータは不要です。フォームオブジェクトから取り除いておきます。メソッドにバリデーション後のデータ一式を渡して、登録を行います。メソッドの戻り値を確認すると良いでしょう。結果表示は、独立して行わず、リスト表示に戻しています。実用的なアプリケーションでも、このようにリダイレクトによって2重POSTによる誤動作を防ぎます。更新アクションを定義します。モデルオブジェクトを生成し、readする。end更新のフォーム表示は、新規登録の時と違い、既存データが入力された状態で表示しなければなりません。そのため、IDをキーにモデルを使ってデータをreadし、その内容をフォームにセットする動作が必要です。IDはフォームを使って取り出すこともできますが、プライマリキー等の単純なデータ1つを取得したい場合には、この例の通りget_parameterメソッドを使うとより簡単になります。テンプレートは、新規登録と同じです。モデルオブジェクトを生成し、updateする。リダイレクトを使って、デフォルト(リスト表示)へ戻る。