Вы должны принять двусторонний подход, чтобы предотвратить это:
Во-первых, отключите кнопку отправки при отправке. Например, в jQuery:
$('#form_id').submit(function(event) {
event.preventDefault();
$('input[type=submit]', this).attr('disabled', 'disabled');
// submit form via ajax...
}
Во-вторых, выполните рациональную проверку на стороне сервера, чтобы предотвратить повторные сохранения. Например, две идентичные записи, представленные в течение минуты или около того, будут считаться ошибкой. Вероятно, я бы сделал это, создав пользовательское правило проверки для одного из полей, которое всегда требуется. В вашей модели:
var $validate = array(
'myfield' => array(
'rule' => 'duplicateCheck',
'message' => 'Duplicate record'
)
);
function duplicateCheck() {
$conditions = array(
'Model.field1' => $this->data['Model']['field1'],
...
'Model.created >' => date("Y-m-d H:i:s", time() - 60)
);
return !$this->hasAny($conditions);
}
Затем в вашем контроллере я перенаправил бы пользователя к существующей записи, если сохранение не удалось, и это было из-за этого конкретного правила проверки. Это позволяет пользователю двигаться вперед, не заботясь о том, что что-то пошло не так.
function add() {
if(isset($this->data)) {
if($this->Model->save($this->data)) {
...
} else {
if(isset($this->Model->validationErrors['myfield'])) {
// find the existing record and redirect user to view it
}
}
}
}