使用cakephp保存数据不起作用

时间:2011-11-11 22:34:51

标签: error-handling save cakephp-2.0

我正在尝试使用load editsaveCakePHP 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 个答案:

答案 0 :(得分:5)

我认为问题可能在于您查询用户记录的方式。当你这样做时:

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

变量$user将用户记录填充为数组。你检查确保它不是空的,然后继续; 问题是$this->User尚未填充。我想如果你试过debug($this->User->id)它会是空的。 read() method按照您的思维方式运作。

您可以尝试使用$user数组中的ID首先设置模型ID,如下所示:

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接收表单数据的方式相同,并在本书的Saving Your Data部分进行了描述。

我很好奇,如果你的设置的另一部分阻碍了。您应用的其他部分可以正确写入数据库吗?您还应检查以确保没有验证错误,例如:

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