首页 文章

Laravel Ajax更新方法不允许405

提问于
浏览
0

我一直坚持我正在做的这一行代码 . 它说mthod是不允许的,但我已经做了一些修复来接受请求

服务控制器

public function peakmode(Request $request, $id)
{
    $command = new \App\BizCommands\UpdatePeakmodeServices();
    $arr = $request->all();
    //$arr["merchant_id"] = $this->get_id();
    $service->merchant_id = 1;
    $arr["id"] = $id;
    $ret = $command->execute($arr, Auth::user());
    //return response()->json(['success'=> ($ret->error_code==0), 'message'=> $ret->message]);

    $message = array('message' => 'Service Successfully Updated!');
    return redirect()->back()->with($message);
}

刀片形式

<form action="{{ route('services.peakmode', $service->id) }} ">
{{method_field('PUT')}}
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="serviceswitch-7838" service-id="{{ $service->id }}"> 
<label class="onoffswitch-label" for="serviceswitch-7838"> <span class="onoffswitch-inner"></span> <span class="onoffswitch-switch"></span> </label>

Ajax脚本

$(".onoffswitch .onoffswitch-checkbox").on("change",function(e){
  service_id = $(this).attr('service-id');
  if($(this).is(':checked') ){
    peak = 1;
  }else{
    peak = 0;
  }
  $.ajax({
    method: "POST",
    url: $(this).prop('action'),
    data: { 
      service_id: service_id,
      peak: peak,
      '_method': 'PUT',
      "_token": "{{ csrf_token() }}",
    }
  })
  .done(function(response){
    console.log(response);
  });
});

路线

Route::post('/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');

4 回答

  • 0

    改变路线:

    Route::match(['POST', 'PUT'], '/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');
    
  • 0

    您使用的是POST而不是PUT

    Route::put('/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');
    

    我不确定PUT是否也在AJAX中使用,但如果单独失败,你可以试试 .

    不专业我自己单独使用所有POST和GET,所以我不必处理PUT和DELETE

    my workaround:

    <form action="{{ route('services.peakmode', $service->id) }} " method="POST">
    //make sure not to include the {{method line}}
    

    并在AJAX调用

    $.ajax({
        method: "POST",
        url: $(this).prop('action'),
        data: { 
          service_id: service_id,
          peak: peak,
          "_token": "{{ csrf_token() }}",
        }
      })
    

    和路线

    Route::post('/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');
    
  • 0

    您已在表单中添加方法 POST 的路由,并在表单更改方法 PUT 中使用方法 PUTPOST

    {{method_field('POST')}}
    
  • 0

    你必须在ajax中添加方法 POST 然后你必须像这样添加 X-CSRF-TOKEN

    Laravel Documentation https://laravel.com/docs/5.7/csrf#csrf-x-xsrf-token

    除了检查CSRF令牌作为POST参数之外,VerifyCsrfToken中间件还将检查X-CSRF-TOKEN请求头 . 例如,您可以将令牌存储在HTML元标记中:

    <meta name="csrf-token" content="{{ csrf_token() }}">
    

    然后,一旦创建了元标记,就可以指示像jQuery这样的库自动将标记添加到所有请求标头中 . 这为基于AJAX的应用程序提供了简单,方便的CSRF保护:

    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    

    现在,你的ajax请求看起来像,

    $.ajax({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
        type:'POST',
        url: $(this).prop('action'),
        data: { 
          service_id: service_id,
          peak: peak,
        }
        success: function(result) {
            console.log(result);
        },
        error: function(result){
            console.log(result);
        }
    });
    

    如果有任何困惑随意问 .

    以下是使用laravel和ajx进行补丁请求的方法,请参阅此问题PATCH AJAX Request in Laravel

相关问题