2016-03-08 117 views
1

我想更新一篇文章。创建和删除帖子可以很好地工作,但每当我尝试使用PATCH表单进行更新时,它都会失败,并提供MethodNotAllowedHttpExceptionLaravel 5.2 MethodNotAllowedHttpException带有修补程序的路由:: resource

我routes.php文件:

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

这给了我可能的路线如下表(CSS中粘贴保持可读性):

| GET|HEAD | posts     | posts.index   | App\Http\Controllers\[email protected] 
| POST  | posts     | posts.store   | App\Http\Controllers\[email protected]  
| GET|HEAD | posts/create    | posts.create   | App\Http\Controllers\[email protected]  
| GET|HEAD | posts/{posts}   | posts.show   | App\Http\Controllers\[email protected]   
| DELETE | posts/{posts}   | posts.destroy  | App\Http\Controllers\[email protected]   
| PUT|PATCH | posts/{posts}   | posts.update   | App\Http\Controllers\[email protected]  
| GET|HEAD | posts/{posts}/edit  | posts.edit   | App\Http\Controllers\[email protected] 

我edit.blade.php(URL =本地主机:8000 /职位/ 1 /编辑):

{!! Form::model($post, ['method' => 'PATCH', 'action' => ['[email protected]', $post]]) !!} 
     @include('posts/_form', array('submitText' => 'Update')) 
    {!! Form::close() !!} 

我的PostsController:

public function update(Request $request, Post $post) { 
     $post->update($request->all()); 
     return Redirect::route('posts.index')->with('message_succes', 'Post updated'); 
} 

无论我尝试,它失败与

MethodNotAllowedHttpException RouteCollection-> methodNotAllowed(阵列( 'GET', 'HEAD', 'POST'))在 RouteCollection.php线206

查看表格的HTML源代码,并正确插入标记。 将PATCH更改为在表单中发布时,它将使用商店功能并创建一个新帖子。我需要做些什么来更新帖子?

+2

你应该只传递一个表单动作的id。你用'$ post'。由于您没有共享'edit()'方法,我们不知道'$ post'变量中返回的是什么。如果$ post是一个集合,使用'['PostController @ update',$ post-> id]'。如果不行,请分享'edit()'方法的代码。 – smartrahat

+0

@smartrahat是的,你是对的。已经发现我确实发布了完整的对象。现在正在工作。 – Trekdrop

回答

0

尝试改变PATCH方法把在这样的形式:

{!! Form::model($post, ['method' => 'PUT', 'action' => ['[email protected]', $post]]) !!} 
    @include('posts/_form', array('submitText' => 'Update')) 
{!! Form::close() !!} 
+0

感谢您的回复。它给了我同样的错误。还有一件事要说的是,这些字段没有填充条目。 – Trekdrop

1

原来,我张贴了完整的对象,而不是只有ID。 我不得不改变:在形式和PostController的更新

$post$post->id

public function update(Request $request, $post_id) { 
     $post = Post::findOrFail($post_id) 
     $post->update($request->all()); 
     return Redirect::route('posts.index')->with('message_succes', 'Post updated'); 
} 
-1

尼斯,你是正确的!但是你反过来说,$ post-> id为$ post,那么控制器将使用整个对象来代替单个对象。现在在这里工作。谢谢!

0

对于那些,谁只是忘了指定编辑表单动作/路线,即:

{!! Form::model($post, ['method' => 'PATCH']) !!} 
    ... 
    Form controls 
    ... 
{!! Form::close() !!} 

如果不显式指定editupdate形式的行动,Form::model()将使用当前的路线,例如<site>/posts/<id>/edit。所以,不要忘了真正update动作的位置,或者通过路线:

{!! Form::model($post, ['method' => 'PATCH', 'route' => ['posts.update', $post]]) !!} 
    ... 
    Form controls 
    ... 
{!! Form::close() !!} 

...这是我个人比较喜欢,“职高它更普遍,或通过的行动:

{!! Form::model($post, ['method' => 'PATCH', 'action' => ['[email protected]', $post->id]]) !!} 
    ... 
    Form controls 
    ... 
{!! Form::close() !!} 

..这略显过于冗长和具体。