さっきから $model->save()
してるんだけど、あれ、保存されない。。
ちょっと待ってください。モデルへの入力値は大丈夫ですか?
もしかしたら、バリデーションで引っかかってエラーが出てるのかもしれませんよ。
こうゆう時のために、デバッグ用にバリデーションのエラーを出力しておくとはかどります。
モデルのvalidationErrors
例えば、モデルの $validate
に次のように設定していたとしましょう。
User.php
<?php
public $validate = array(
'name' => array(
'notEmpty' => array(
'rule' => array('notEmpty'),
'message' => '名前が設定されていません',
'allowEmpty' => false,
'required' => true,
),
),
);
このモデルのデータの保存ができなかった場合、まずバリデーションエラーを疑ってみましょう。
バリデーションのエラーは $model->validationErrors
に配列で格納されています。
次のようにコントローラーで出力します。
UsersController.php
<?php
class UsersController extends AppController {
public function add() {
if ($this->request->is('post')) {
$this->User->create();
if ($this->User->save($this->request->data)) {
$this->Session->setFlash(__('The user has been saved.'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The user data could not be saved. Please, try again.'));
// saveに失敗したら、バリデーションエラーをログ出力
debug($this->User->validationErrors);
// 外部ログファイルに出力することも可能
$this->log("validationErrors=" . var_export($this->User->validationErrors, true));
}
}
}
}
としてあげて、もしエラーがあれば
array(
'name' => array(
(int) 0 => '名前が設定されていません'
)
)
とログ出力されます。
オーマイガッ、ユーザー登録で名前を忘れるとは何事だっ!
効率よくデバッグするためにはログ大事
ちゃんとログを確認することはデバッグの基本です。
原因がわからなくなったら、ログを確認することで早く問題解決したり、うっかりミスが無くなりますよ。