You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel+DataTables删除功能:路由参数缺失与405错误排查

Laravel DataTables 删除功能路由及405错误解决方案

问题背景

开发Laravel应用时,使用DataTables展示messages表数据,列表页的排序、分页、搜索功能均正常,添加编辑和删除按钮后,删除功能遇到路由参数及405错误问题。

相关代码

路由文件(web.php)

Route::middleware('auth')
    ->namespace('Admin')
    ->name('admin.') 
    ->prefix('admin') 
    ->group(function () {
        Route::get('/', 'HomeController@index')->name('home');
        Route::resource('/user', 'UserController');/* ->except(['edit', 'update']); */
        Route::resource('/user/{user:id}/messages', 'MessagesController');
    });

Route::get('messages', 'Admin\MessagesController@getMessages')->name('get.messages');

Auth::routes();

MessagesController的getMessages方法

public function getMessages()
{
    $user = Auth::user();
    return DataTables::of(Message::query())
        ->addColumn('action', function ($message) use ($user) {
            return '<a href="javascript:void(0)" data-toggle="tooltip"  data-id="' . $message->id . '"  class="btn btn-xs btn-primary" data-toggle="modal" data-target="#edit-modal-' . $message->id . '"><i class="glyphicon glyphicon-edit"></i> Modifica</a>
            <a href="javascript:void(0)" class="btn btn-xs btn-danger deleteMessage" data-id="' . $message->id . '" data-user="' . auth()->user()->id . '" data-toggle="modal" data-target="#delete-modal-' . $message->id . '"><i class="glyphicon glyphicon-trash"></i> Elimina</a>
            ';
        })
        ->setRowClass('{{$id % 2 == 0 ? "alert-success" : "alert-danger"}}')
        ->setRowId(function ($message) {
            return $message->id;
        })
        ->setRowAttr(['align' => 'center'])
        ->make(true);
}

删除功能jQuery代码

$('body').on('click', '.deleteMessage', function() {
    var id = $(this).data("id");
    confirm("Are You sure want to delete this Post!");

    $.ajax({
        type: "DELETE",
        url: "{{ route('admin.messages.destroy', ['user' => auth()->user()->id]) }}/" + id,
        success: function(data) {
            table.draw();
        },
        error: function(data) {
            console.log('Error:', data);
        }
    });
});

问题详情

最初点击删除按钮触发UrlGenerationException,提示admin.messages.destroy路由缺少必要参数。调整后页面可正常显示记录,但点击删除确认后出现405 Method Not Allowed错误,页面记录未即时消失;刷新页面后数据库记录已删除,且显示成功提示。

解决方案

1. 修复路由参数传递错误

嵌套资源路由admin.user.messages.destroy需要两个必填参数:user(用户ID)和message(消息ID),不能通过URL拼接方式传递参数,需正确生成路由:

var userId = $(this).data("user");
var messageId = $(this).data("id");
// 直接构造符合路由规则的URL
url = `/admin/user/${userId}/messages/${messageId}`;

也可以使用Laravel路由生成后替换占位符:

url: "{{ route('admin.messages.destroy', ['user' => auth()->user()->id, 'message' => 'MESSAGE_ID']) }}".replace('MESSAGE_ID', id),

2. 解决CSRF令牌导致的405错误

Laravel要求所有非GET请求必须携带CSRF令牌,否则会触发权限验证错误:

  • 确保页面头部已包含CSRF meta标签:
<meta name="csrf-token" content="{{ csrf_token() }}">
  • 在AJAX请求中添加CSRF请求头:
$.ajax({
    type: "DELETE",
    url: `/admin/user/${userId}/messages/${messageId}`,
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    },
    // ... 其他配置
});

3. 完善删除确认逻辑

原代码中confirm未判断用户选择,无论点击确定/取消都会发送请求,需添加判断:

if (!confirm("Are You sure want to delete this Post!")) {
    return;
}

4. 优化前端刷新逻辑

删除成功后直接移除对应行,比重新绘制整个DataTables更高效:

success: function(data) {
    // 通过之前设置的rowId直接移除行
    $('#' + messageId).remove();
    // 如果需要重新加载最新数据,保留table.draw()
    // table.draw();
}

5. 后端权限与响应优化(可选)

在MessagesController的destroy方法中添加权限验证,确保用户只能删除自己的消息,并返回标准响应:

public function destroy(User $user, Message $message)
{
    // 验证当前用户是否有权删除该消息
    if ($message->user_id !== auth()->id()) {
        return response()->json(['error' => '无权限删除该消息'], 403);
    }
    
    $message->delete();
    return response()->json(['success' => '消息删除成功'], 200);
}

内容的提问来源于stack exchange,提问作者DanieleFic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:05:23