1

我设置了一个编辑页面来编辑博客文章。这是控制器动作...

public function edit($id = null) {
    $post = $this->Post->findById($id);

    if(!$post) {
        throw new NotFoundException('Post not found');
    }

    if($this->request->is('post')) {
        $this->Post->id = $id;
        if($this->Post->save($this->request->data)) {
            $this->Session->setFlash('Post updated!');
            $this->redirect('/');
        } else {
            $this->Session->setFlash('Unable to update post!');
        }
    }

    if (!$this->request->data) {
        $this->request->data = $post;
    }

    $this->set('tags', $this->Post->Tag->find('list'));
    $this->set('pageTitle', 'Edit blog post');
}

和编辑页面视图...

<h1>Edit blog post</h1>

<?php echo $this->Form->create('Post'); ?>
<?php echo $this->Form->input('Post.title'); ?>
<?php echo $this->Form->input('Post.body'); ?>
<?php echo $this->Form->input('Tag.Tag', array('type' => 'text', 'label' => 'Tags (seperated by space)', 'value' => $tags)); ?>
<?php echo $this->Form->input('Post.slug'); ?>
<?php echo $this->Form->end('Save Changes'); ?>

出于某种原因,当我进行更改并单击“保存更改”时,页面会刷新,尽管更改会在刷新后反映在表单中,但我必须再次单击“保存更改”才能将它们保存到数据库中蛋糕将我重定向到/

可能是什么原因造成的?

4

1 回答 1

1

因为Post.id您的表单中没有,CakePHP 第一次发送一个PUT请求(而不是一个POST请求)来创建(或“放置”)一个新行到您的数据库中。这没有通过您的请求检查:

if($this->request->is('post'))

现在,此时您的逻辑使用以下代码获取相应帖子的整行:

$this->request->data = $post;

这将包括给定帖子的 ID,因为它在您的find()结果中,因此您第二次提交它时,它有一个 id,因此发送POST请求而不是PUT请求。

假设您只想编辑现有帖子,id请在表单中添加一个字段(FormHelper automagic 应该为其创建一个隐藏字段,但您始终可以明确告诉它,如下例所示):

echo $this->Form->input('Post.id', array('type' => 'hidden');

这应该传递 id 并因此触发POST请求而不是PUT请求并使您的提交立即通过。

于 2013-01-09T20:50:30.323 回答