我想更新帖子。创建和删除帖子非常有效,但每当我尝试使用PATCH表单更新帖子时,它都会失败并提供MethodNotAllowedHttpException
。
我的routes.php:
...
Route::resource('posts', 'PostsController');
...
这给了我以下可能的路线列表(粘贴在css中以保持可读性):
| GET|HEAD | posts | posts.index | App\Http\Controllers\PostsController@index
| POST | posts | posts.store | App\Http\Controllers\PostsController@store
| GET|HEAD | posts/create | posts.create | App\Http\Controllers\PostsController@create
| GET|HEAD | posts/{posts} | posts.show | App\Http\Controllers\PostsController@show
| DELETE | posts/{posts} | posts.destroy | App\Http\Controllers\PostsController@destroy
| PUT|PATCH | posts/{posts} | posts.update | App\Http\Controllers\PostsController@update
| GET|HEAD | posts/{posts}/edit | posts.edit | App\Http\Controllers\PostsController@edit
我的edit.blade.php(url = localhost:8000 / posts / 1 / edit):
{!! Form::model($post, ['method' => 'PATCH', 'action' => ['PostsController@update', $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(array('GET','HEAD','POST'))in RouteCollection.php第206行
查看表单的html源,正确插入PATCH和令牌。 将PATCH更改为在表单中发布时,它将使用商店功能并创建新帖子。我需要做些什么来更新帖子?
答案 0 :(得分:1)
原来我发布了完整的对象,而不仅仅是ID。 我不得不改变:
表单中的 $post
到$post->id
,并且PostController更新为:
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 :(得分:0)
尝试将PATCH方法更改为以下格式:
{!! Form::model($post, ['method' => 'PUT', 'action' => ['PostsController@update', $post]]) !!}
@include('posts/_form', array('submitText' => 'Update'))
{!! Form::close() !!}
答案 2 :(得分:0)
对于那些忘记指定编辑表格的行动/路线的人,即:
{!! Form::model($post, ['method' => 'PATCH']) !!}
...
Form controls
...
{!! Form::close() !!}
如果您未在update
页面上明确指定edit
表单操作,Form::model()
将使用当前路由,例如<site>/posts/<id>/edit
。所以,不要忘记真实的update
行动地点,要么通过路线:
{!! Form::model($post, ['method' => 'PATCH', 'route' => ['posts.update', $post]]) !!}
...
Form controls
...
{!! Form::close() !!}
...我个人更喜欢,&#39;更通用,或通过行动:
{!! Form::model($post, ['method' => 'PATCH', 'action' => ['PostsController@update', $post->id]]) !!}
...
Form controls
...
{!! Form::close() !!}
......这有点过于冗长和具体。
答案 3 :(得分:-1)
很好,你是对的!但你评论反向,$ post-&gt; id到$ post然后控制器将使用整个对象而不是单个。现在在这里工作。谢谢!