バリデーションに関するTipsその2です。
これも意外に情報が書かれていないのですが、Model::validates()とModel::invalidate()の組み合わせ利用では順番があるようで、気をつけないと正しいバリデーション処理が行えないようです。
validates()は「モデルに記述したバリデーションルールを実行する」メソッドで、save()等でも自動的に実行されますが直接呼ぶことで明示的に、事前に処理することが出来ます。
また、invalidate()は、独自に値チェックなどを行った結果で、エラーメッセージを出したい場合に用いるメソッドで、フォーム内のインプットの各アイテムに手動でメッセージを出したい場合に使います。
これらを組み合わせる場合、まずvalidates()が先に実行されている必要があるようです。逆にinvalidate()がvalidates()より先に実行された場合、invalidate()で表示させようとしたエラーメッセージが表示されません。
class FooController extends AppController { var $name = "Foo"; var $uses = array('Foo'); //OKな例 function bar(){ $this->Foo->set($this->data); $this->Foo->validates(); $this->Foo->invalidate('fields', 'Good Cake'); } //NGな例 function hoge(){ $this->Foo->set($this->data); $this->Foo->invalidate('fields', 'Bad Cake'); $this->Foo->validates(); } }
バリデーションが上手く機能しない場合はこれが理由である場合もありますので、心当たりがありましたらチェックしてみてください。
コメントは受け付けていません。