Метод обновления Laravel Ajax не разрешен 405 - PullRequest
0 голосов
/ 09 декабря 2018

Я застрял в этой строке кода, которую я делаю.В нем говорится, что 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 Script

$(".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 голосов
/ 09 декабря 2018

Вы добавили маршрут метода POST и использовали метод PUT в методе изменения формы PUT в POST в форме

 {{method_field('POST')}}
0 голосов
/ 09 декабря 2018

Вы должны добавить только метод POST в ajax, а затем вы должны добавить X-CSRF-TOKEN, как это,

Документация Laravel 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, автоматически добавлять токен во все заголовки запроса.,Это обеспечивает простую и удобную защиту CSRF для ваших приложений на основе AJAX:

$.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 в Laravel

0 голосов
/ 09 декабря 2018

Изменить маршрут на:

Route::match(['POST', 'PUT'], '/merchant/services/peakmode/{id}', 'Merchant\ServicesController@peakmode')->name('services.peakmode');
0 голосов
/ 09 декабря 2018

Вы использовали POST вместо PUT

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

Я не уверен, что PUT также используется в AJAX, но вы можете попробовать это, если это само по себе не удастся.

Непрофессионально я самиспользуйте все POST и GET в одиночку, поэтому мне не нужно иметь дело с PUT и DELETE

мой обходной путь:

<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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...