尝试通过Laravel中的Ajax将数据发布到控制器时出现MethodNotAllowedHttpException

时间:2018-12-28 08:48:13

标签: javascript php ajax laravel voyager

我正在尝试通过laravel中的ajax将动态生成的数据发送到控制器。当用户从下拉菜单中选择一个选项时,则应将所选选项和其他数据一起发送到控制器。

当从下拉列表中选择一个选项时,我尝试将数据发送到控制器。但是每次我尝试此错误时,

  

Symfony \组件\ HttpKernel \ Exception \ MethodNotAllowedHttpException   并在错误中   REQUEST_METHOD为GET

这是我调用ajax函数的地方

$(document).on('change', '.route-code-selector', function() {
      var selectorID = $(this).attr('id');
      addRoutePlanDetails(selectorID);
 });

AJAX功能

function addRoutePlanDetails(selectorID) {
    var routePlanCode = document.getElementById("routeplanno").value;
    var driver = $("#selectDriver").val().split('|');
    var salesman = $("#selectSalesman").val().split('|');
    var router_01 = $("#selectRouter01").val().split('|');
    var router_02 = $("#selectRouter02").val().split('|');
    var vehicle_no = document.getElementById("enterVehicleNo").value;
    var route_code = document.getElementById(selectorID).value;
    var date = document.getElementById("date").value;

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
    }
});
$.ajax({
    url: 'addNewRoute',
    method: 'POST',
    dataType: 'json',
    data: {
        routePlanCode: routePlanCode,
        driver: driver[1],
        salesman: salesman[1],
        router_01: router_01[1],
        router_02: router_02[1],
        vehicle_no: vehicle_no,
        route_code: route_code,
        date: date
    },
    success: function() {
        console.log("success");
    }
});
}

路线

Route::group(['prefix' => 'admin'], function () {
    Voyager::routes();

    Route::get ('route-plan', 'RoutePlanController@index');
    Route::get ('excludePorterRes', 'RoutePlanController@excludePorterRes');
    Route::get ('retreiveRouteData', 'RoutePlanController@retrieveRouteCodeData');
    Route::get ('retreiveUserData', 'RoutePlanController@retreiveUserData');
    Route::get ('retreiveNewRouteData', 'RoutePlanController@retreiveNewRouteData');

    Route::post('addNewRoute', [
        'uses' => 'RoutePlanController@insertNewRoute',
        'as' => 'addNewRoute'
    ]);
});

控制器

public function insertNewRoute(){

    $routeplan = new Routeplan;
    $user_email = auth()->user()->email;

    $routeplan->RouteplanCode = Input::get('routePlanCode');
    $routeplan->RouteCode = Input::get('route_code');
    $routeplan->DriverID = Input::get('driver');
    $routeplan->SalesmanID = Input::get('salesman');
    $routeplan->Routercode1 = Input::get('router_01');
    $routeplan->Routercode2 = Input::get('router_02');
    $routeplan->VehicleNo = Input::get('vehicle_no');
    $routeplan->Date = Input::get('date');
    $routeplan->Createuser = $user_email;
    $routeplan->Status = 'TEMP';

    $routeplan->save();
}

当用户选择一个选项时,所有数据都应存储在数据库中。

8 个答案:

答案 0 :(得分:0)

尝试一次

url: '{{ route('addNewRoute') }}',

答案 1 :(得分:0)

问题在这里:

url: 'addNewRoute',

在这里您以错误的方式呼叫路线,请按照以下方式使用它:

url: '{{ url('admin/addNewRoute') }}',

您必须调用url()方法,以便它可以创建正确的url格式,并且不要忘记addNewRoute被分组在admin下,因此必须将其附加到调用时。

答案 2 :(得分:0)

您已使用@Provider public class CustomHandler implements ExceptionMapper<Exception> { public Response toResponse(Exception ex) { if(ex instanceOf ConstraintViolationException) { Do something } } 作为路线。因此,您在组中的所有路线都是prefix。 因此,在prefix/uri通话中,您应该ajax并将url: '{{ url('admin/addNewRoute') }}',更改为method

type

$.ajax({ url: '{{ url('admin/addNewRoute') }}', type: 'POST', dataType: 'json', data: { routePlanCode: routePlanCode, driver: driver[1], salesman: salesman[1], router_01: router_01[1], router_02: router_02[1], vehicle_no: vehicle_no, route_code: route_code, date: date }, success: function() { console.log("success"); } }); 中指定ajax时使用HTTP Verb而不是type

答案 3 :(得分:0)

如果ajax方法在外部javascript文件中运行,则应在blade(通常是布局刀片)中定义一个url变量,该变量用作ajax调用方法上的ajax请求url。 (在加载.js文件之前);

示例var url = '{{ route('addNewRoute') }}'

$.ajax({
    url: url',
    method: 'POST',
    dataType: 'json',
    data: {
        routePlanCode: routePlanCode,
        driver: driver[1],
        salesman: salesman[1],
        router_01: router_01[1],
        router_02: router_02[1],
        vehicle_no: vehicle_no,
        route_code: route_code,
        date: date
    },
    success: function() {
        console.log("success");
    }
});

如果您在刀片服务器中使用ajax,则可以直接将route用作ajax请求网址。

$.ajax({
    url: "{{ route('addNewRoute') }}",
    method: 'POST',
    dataType: 'json',
    data: {
        routePlanCode: routePlanCode,
        driver: driver[1],
        salesman: salesman[1],
        router_01: router_01[1],
        router_02: router_02[1],
        vehicle_no: vehicle_no,
        route_code: route_code,
        date: date
    },
    success: function() {
        console.log("success");
    }
}); 

答案 4 :(得分:0)

您在路线中忘记了/

Route::group(['prefix' => 'admin'], function () {

/中添加admin/

Route::group(['prefix' => 'admin/'], function () {

然后您可以在ajax中尝试

url: '{{ url('admin/addNewRoute') }}',

url: 'admin/addNewRoute',

尝试一下是否可行。

答案 5 :(得分:0)

如果您的脚本位于刀片文件中,请使用route()在ajax中设置url:

$.ajax({
    url: '{{route('addNewRoute')}}',
    method: 'POST',
    dataType: 'json',
    ...
});

答案 6 :(得分:0)

尝试一下:

请使用 url:'{{route('addNewRoute')}}'代替url:'addNewRoute'。

答案 7 :(得分:0)

正如你们中许多人所说的那样。我改变了方法的类型,但仍然无法正常工作。但是后来我查看了laravel日志(存储/日志),从日志中发现我的某些控制器语法不正确。这就是为什么它仍然给我500错误的原因。之后,我更改了语法并进行了更正。有效 !!无论如何,感谢你们的帮助!即使您的ajax正确,如果有人遇到此错误,请查看laravel日志。希望对您有所帮助。