Laravel - 编辑和更新页面

4

我正在使用 Laravel,并尝试创建一个编辑页面,然后在提交时调用我的更新方法,但问题是在更新时我收到了404错误。这是我的Blade文件用于编辑如下:

@extends('adminlte::page')

@section('title', 'AdminLTE')

@section('content_header')
    <h1>Professions</h1>
@stop

@section('content')
    <form method="PUT" action="/admin/professions-update/{{ $data->pkprofession }}">
        <div class="form-group">
            <label for="profession_name">Profession Name</label>
            <input type="text" name="profession_name" id="profession_name" class="form-control" value="{{$data->profession_name}}" />
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-success">Update</button>
        </div>
    </form>
@stop

以下是我的路由:

Route::get('/admin/professions-edit/{id}', 'v1\ProfessionsController@edit');
Route::put('/admin/professions-update/{id}', 'v1\ProfessionsController@update');

下面是被调用的方法:

public function edit($id)
    {
        $data = PdTprofession::find($id);
        return view('professions-edit', compact('data'));
    }

public function update(Request $request, $id)
    {
        $data = PdTprofession::find($id);
        return view('professions-edit', compact('data'));
    }

我为什么会遇到404错误,如何解决?

谢谢。


使用方法为POST,并在表单中添加@method('PUT'),不要使用method=PUT。同时,不要忘记CSRF令牌。 - Saromase
尝试使用以下代码:<form method="POST" action="/admin/professions-update/{{ $data->pkprofession }}">@csrf @method("PUT") - ErDiablo
3个回答

5
在 Laravel 文档 中,HTML表单不支持PUT、PATCH或DELETE操作。因此,在定义从HTML表单调用的PUT、PATCH或DELETE路由时,您需要向表单添加一个隐藏的_method字段。发送到_method字段的值将被用作HTTP请求方法:
<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

您可以使用@method Blade指令来生成_method输入:
<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>

谢谢,特别是_token部分。 - user979331
不客气!如果这个答案或其他任何答案解决了您的问题,请将其标记为已接受。 - Rahul
这个答案已经被接受了,需要等待几分钟。 - user979331

3

你的代码存在很多问题,让我们一一解决:

action="/admin/professions-update/{{ $data->pkprofession }}">

将其改为:

action="{{ url('/admin/professions-update/' . $data->pkprofession) }}">

而HTML表单不支持PUT、PATCH或DELETE操作,因此请将其更改为:

<form action="{{ url('/admin/professions-update/' . $data->pkprofession) }}" method="POST">
    @method('PUT')
    @csrf  // this is required when you are using the method other then 'get'
    other elements
</form>

2
你缺少了 csrf 令牌和 method 输入。尝试这样做:

@extends('adminlte::page')

@section('title', 'AdminLTE')

@section('content_header')
    <h1>Professions</h1>
@stop

@section('content')
    <form method="POST" action="/admin/professions-update/{{ $data->pkprofession }}">
        @csrf
        @method('PUT')
        <div class="form-group">
            <label for="profession_name">Profession Name</label>
            <input type="text" name="profession_name" id="profession_name" class="form-control" value="{{$data->profession_name}}" />
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-success">Update</button>
        </div>
    </form>
@stop


此外,在你的update方法中,你忘记更新对象了,将以下代码添加到你的代码中:
$data->update($request->all());

更多信息:文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接