Сохранение данных с помощью CakePHP не будет работать - PullRequest
0 голосов
/ 12 ноября 2011

Я пытаюсь load, edit и save записать с CakePHP 2.0, но я получаю generic error во время метода save, который не помогает мне понять, в чем проблема.

если я попробую с debug($this->User->invalidFields());, я получу empty array, но я получу false из условия $this->User->save().

Вот действие контроллера, где я получаю ошибку:

public function activate ($code = false) {
    if (!empty ($code)) {

        // if I printr $user I get the right user
        $user = $this->User->find('first', array('activation_key' => $code));

        if (!empty($user)) {
            $this->User->set(array (
                'activation_key' => null,
                'active' => 1
            ));

            if ($this->User->save()) {
                $this->render('activation_successful');
            } else {
                // I get this error
                $this->set('status', 'Save error message');
                $this->set('user_data', $user);
                $this->render('activation_fail');
            }
            debug($this->User->invalidFields());

        } else {
            $this->set('status', 'Account not found for this key');
            $this->render('activation_fail');
        }
    } else {
        $this->set('status', 'Empty key');
        $this->render('activation_fail');
    }
}

Когда я пытаюсь выполнить действие test.com/users/activate/hashedkey, я получаю шаблонную страницу activation_fail с сообщением Save error message.

Если я printr $user var, я получаюПравильный пользователь из метода find торта.

Где я не прав?

1 Ответ

5 голосов
/ 12 ноября 2011

Я думаю, что проблема может заключаться в том, что вы запрашиваете запись пользователя. Когда вы делаете это:

$user = $this->User->find('first', array('activation_key' => $code));

Переменная $user заполняется записью пользователя в виде массива. Вы проверяете, чтобы убедиться, что он не пустой, затем продолжаете; но проблема в том, что $this->User не был заполнен. Я думаю, что если вы попробуете debug($this->User->id), это будет пусто. Метод read () работает так, как вы думаете.

Вы можете попробовать использовать идентификатор из этого массива $user, чтобы сначала установить идентификатор модели, например:

if (!empty($user)) {
    $this->User->id = $user['User']['id']; // ensure the Model has the ID to use
    $this->User->set(array (
        'activation_key' => null,
        'active' => 1
    ));
    if ($this->User->save()) {
    ...

Редактировать: Хорошо, другой возможный подход - использовать массив $user вместо изменения текущей модели. Вы сказали, что вернете действительного пользователя, если вы debug($user), поэтому, если это правда, вы можете сделать что-то вроде этого:

if (!empty($user)) {
    $user['User']['activation_key'] = null;
    $user['User']['active'] = 1;
    if ($this->User->save($user)) {
    ...

Этот метод работает так же, как получение данных формы из $this->request->data, и описан в Сохранении ваших данных в части книги.

Мне любопытно, если есть другая часть вашей установки, которая мешает. Могут ли другие части вашего приложения правильно записывать в базу данных? Вы также должны проверить, чтобы убедиться, что у вас нет ошибок проверки, как их пример:

<?php
if ($this->Recipe->save($this->request->data)) {
    // handle the success.
}
debug($this->Recipe->validationErrors);
...