Laravel4:删除评论

时间:2013-08-16 06:59:28

标签: php laravel laravel-4 nested-resources

我有一个简单的博客,包含Post资源和Comment嵌套资源。 到目前为止,我可以看到属于帖子的所有评论,并为帖子创建新评论。

我想提供删除特定评论的可能性,但不知何故我犯了一些错误。

这是包含所有评论的视图comments.index

@extends('master')

@section('blog')

@foreach($comments as $comment)
  <div class="span11 well">
    <ul>
        <li><strong>Body: </strong> {{ $comment->body }} </li>
        <li><strong>Author: </strong> {{ $comment->author }}</li>
    </ul>

{{ Form::open(array('method' => 'DELETE', 'route' => array('posts.comments.destroy', $post_id), $comment->id)) }}

{{ Form::submit('Delete', array('class' => 'btn btn-danger')) }}

{{ Form::close() }}

 </div>
@endforeach
{{ link_to_route('posts.index', 'Back to Post index') }}

这是我运行索引的错误:参数&#34;评论&#34; for route&#34; posts.comments.destroy&#34;必须匹配&#34; [^ /] ++&#34; (&#34;&#34;给出)生成相应的URL。

这是CommentsController里面的Index方法:

public function index($post_id)
{
    $comments = Post::find($post_id)->comments;
    return View::make('comments.index', compact('comments'))->with('post_id', $post_id);
}

这是CommentsController里面的Destroy方法:

public function destroy($post_id, $comment_id)
{
    $comment = $this->comment->find($comment_id)->delete();

    return Redirect::route('posts.comments.index', $post_id);
}

有人可以告诉我,我在哪里犯了错误吗?

这条路线:

Route::resource('posts', 'PostsController');
Route::resource('posts.comments', 'CommentsController');

2 个答案:

答案 0 :(得分:2)

您已在路线上放置了正则表达式测试程序,以检查您的comments参数 此错误消息表明您提供给Laravel的参数不佳。

如果您的参数只是十进制ID,请改用\d+ regexp。

答案 1 :(得分:0)

没有您的routes.php文件 - 我无法确定,但我认为这可能是问题所在。

更改

{{ Form::open(array('method' => 'DELETE', 'route' => array('post.comments.destroy', $post_id), $comment->id)) }

{{ Form::open(array('method' => 'DELETE', 'route' => array('post.comments.destroy', array ($post_id, $comment->id))) }

如果这不起作用 - 请发布routes.php文件。

修改:您已将路线定义为“资源”。这意味着您的销毁路径仅使用一个变量定义。你实际上并不需要包含$ post,所以只需定义:

{{ Form::open(array('method' => 'DELETE', 'route' => array('posts.comments.destroy', $comment->id))) }}

并将您的destroy方法更改为此 - $ post不需要删除$ comment:

public function destroy($comment_id)
{
    $comment = $this->comment->find($comment_id)->delete();

    return Redirect::back();
}