【CakePHP】フォームを使ってレコードを編集したつもりが、レコードが増えてしまう現象

ドットインストールのレッスンを参考に
データベースのレコードを編集する機能を実装してみました。

コントローラ、ビューのコードはこんな感じです。

public function edit($id = null) {
        $this->Item->id = $id;
        if ($this->request->is('get')) {
            $this->autoLayout = false;
            $this->request->data = $this->Item->read();
        } else {
            if ($this->Item->save($this->request->data)) {
                $this->Flash->success(__('Your post has been saved.'));
                $this->redirect(array('action'=>'index'));
            } else {
                $this->Session->error(__('failed!'));
            }
        }
    }
<table>
    <tr>
        <?php echo $this->Form->create('Item', array('url' => 'edit'));?>
        <td><?php echo $this->Form->input('column_01', array('label' => false));?></td>
        <td><?php echo $this->Form->input('column_02', array('label' => false));?></td>
        <td><?php echo $this->Form->input('column_03', array('label' => false));?></td>
        <td><?php echo $this->Form->end('編集完了');?></td>
    </tr>
</table>

これをこのままテストしてみると、
「編集完了」を押すたびに新しい記事ができてしまう現象が起きてしまいました。
「編集 = 上書き」のつもりが新しい項目が作られてしまいました。

 

さっぱりわかんねえよ、と思いながら
CakePHPのチュートリアルをみていると、こんな記述を見つけました。

 

((ひとつ注意: CakePHP は、「id」フィールドがデータ配列の中に存在している場合は、 モデルを編集しているのだと判断します。もし、「id」がなければ、(add のビューを復習してください) save() が呼び出された時、CakePHP は新しいモデルの挿入だと判断します。))

 

というわけで、フォームの入力内容にidがあるか否かで
上書きか新規作成かが決まるとのことでした。これを踏まえてビューを修正します。

<?php
<table>
    <tr>
        <?php echo $this->Form->create('Item', array('url' => 'edit'));?>
        <td><?php echo $this->Form->input('id', array('type' => 'hidden'));?></td>
        <td><?php echo $this->Form->input('column_01', array('label' => false));?></td>
        <td><?php echo $this->Form->input('column_02', array('label' => false));?></td>
        <td><?php echo $this->Form->input('column_03', array('label' => false));?></td>
        <td><?php echo $this->Form->end('編集完了');?></td>
    </tr>
</table>
?>

idをフォームで入力するということはまずないでしょうから、
普通はhiddenを付けておくようです。

 

よーく考えずにコピペして、ちょこちょこ修正して…というやり方だと、
こういう所がおざなりになりがちですね。