データの修正
続いて、保存してあるデータの修正機能を作りましょう。これは、データの作成と検索を組み合わせたような形になります。すなわち、あらかじめ編集するデータを検索して取り出し、値を変更してからまた保存する、といった作業を行えばいいのです。
では、テンプレートを作成しましょう。「views」の「Application」内に、新たに「edit.html」というファイルを作り、次のようにソースコードを記述します。
#{extends 'main.html' /}
#{set title:'Home' /}
<h1>メッセージの編集</h1>
${msg}
#{if data != null}
<form method="post" action="@{Application.edit}">
<input type="hidden" name="id" value="${data.id}" />
<table>
<tr><td>id:</td><td>${data.id}</td></tr>
<tr><td>name:</td><td><input type="text" name="name" value="${data.name}" /></td></tr>
<tr><td>message:</td><td><input type="text" name="message" value="${data.message}" /></td></tr>
<tr><td></td><td><input type="submit" value="送信" /></td></tr>
</table>
</form>
#{/if}
ここでは、特定のデータの編集を行うためのフォームを用意しています。このフォームでは、id番号を<input type="hidden">で保持しており、その他のnameとmessageは<input type="text">で編集できるようにしています。それぞれ、${data}の値をコントロールのvalueに設定することで、編集するデータの値があらかじめ入力フィールドに設定されるようにしておきます。
後はコントローラー側で、あらかじめ編集するデータを取得して${data}として渡すように処理を用意すればいいでしょう。そしてPOST送信されたら、そのデータを修正し保存するわけです。では、コントローラーにeditメソッドを実装しましょう。
public static void edit(long id,String message,String name){
String msg = "データを編集してください。";
MsgData data = null;
data= MsgData.findById(id);
if (request.method.equals("POST")) {
data.name = name;
data.message = message;
data.save();
msg = "データを更新しました。";
}
render(data,msg);
}

編集するデータは、idというパラメータで指定するようにします。アクセスする際、「http://localhost:9000/edit?id=1」というように、editの後に「?id=番号」という形でデータのid番号をつけてアクセスすると、そのデータがフォームにセットされます。これで内容を書き換えて送信すれば、そのデータが修正されます。
ここでは、まずGETでアクセスした際には、引数のidの値を使ってデータを取得し、renderに渡します。idによるデータの取得は、findではなく次のように簡単に行えます。
data= MsgData.findById(id);
「findById」は、引数に指定したid番号のデータを取り出すものです。注意しておきたいのは、「引数はintではなくlongである」という点でしょう。こうしてデータを取り出したら、その値を書き換えて保存します。POST時の処理は、次のように行っています。
data.name = name; data.message = message; data.save();
インスタンスのフィールドに新しい値を設定し、saveで保存するだけです。saveは、このようにデータを新たに保存するだけでなく、既にあるデータの更新にも用いられます。
データの削除
残るは、データの削除です。これも、データの修正のインターフェースをそのまま利用しましょう。id=xxという形でパラメータを付けてアクセスするとそのデータが表示され、ボタンを押して送信するとそのデータが削除される、といった形にするわけです。
まずはテンプレートからです。「views」の「Application」内に「del.html」というファイルを新たに作成し、次のように記述をします。
#{extends 'main.html' /}
#{set title:'Home' /}
<h1>メッセージの削除</h1>
${msg}
#{if data != null}
<form method="post" action="@{Application.del}">
<input type="hidden" name="id" value="${data.id}" />
<table>
<tr><td>id:</td><td>${data.id}「${data.message}」</td></tr>
<tr><td></td><td><input type="submit" value="削除する" /></td></tr>
</table>
</form>
#{/if}
基本的な形は、edit.htmlと同じです。違いは、フォームにはidを送信する<input type="hidden">タグしかない、という点です。削除するid番号さえ分かればいいのですから、これで十分です。
続いてコントローラーです。Applicationクラスに「del」メソッドを新たに用意し、次のように記述をしましょう。
public static void del(long id,String message,String name){
String msg = "データを削除していいですか。";
MsgData data = null;
data= MsgData.findById(id);
if (request.method.equals("POST")) {
data.delete();
msg = "データを削除しました。";
}
render(data,msg);
}

先ほどのeditと同様に「del?id=1」というように削除するデータのid番号をパラメータにつけてアクセスすると、そのデータの内容が表示されます。それを確認し、ボタンをクリックするとそのデータが削除されます。ここでは、MsgData.findById(id)で送られたid番号のデータを取得した後、次のようにして削除をしています。
data.delete();
たったこれだけで、そのデータは削除されます。実に単純です。
