laravel rzuca MethodNotAllowedHttpException
gdy staramy się wysłać wniosek do trasy przy użyciu czasownika HTTP, że trasa nie obsługuje. W przypadku tego pytania, widzimy ten błąd ponieważ kod JavaScript wysyła DELETE żądanie do adresu URL ze ścieżką /job‑management
, który jest obsługiwany przez trasie, która obsługuje tylko GET i POST żądań. Musimy zmienić adres URL na konwencjonalny format, którego Laravel oczekuje od pomysłowych kontrolerów.
Błąd jest mylący, ponieważ ukrywa fakt, że wysyłamy żądanie pod niewłaściwy URL. Aby zrozumieć dlaczego, rzućmy okiem na trasach stworzonych przez Route::resource()
(z documentation):
Verb URI Action Route Name
GET /job-management index job-management.index
GET /job-management/create create job-management.create
POST /job-management store job-management.store
GET /job-management/{position} show job-management.show
GET /job-management/{position}/edit edit job-management.edit
PUT/PATCH /job-management/{position} update job-management.update
DELETE /job-management/{position} destroy job-management.destroy
Jak przedstawiono powyżej, adres URL komponentu ścieżki z /job-management
są przekazywane do kontrolera index()
i store()
metod, które don” t obsłużyć DELETE żądań. Właśnie dlatego widzimy wyjątek.
Aby wykonać DELETE żądania, jak pokazano na pytanie, musimy wysłać żądanie do adresu URL ze ścieżką jak /job-management/{position}
, gdzie {position}
jest identyfikator modelu pozycji, którą chcemy usunąć. Kod JavaScript może wyglądać mniej więcej tak:
axios.delete('/job-management/5', this.deletedata).then((res) => { ... })
Zrobiłem na stałe ID pozycji w adresie URL, aby jasno zilustrować tę koncepcję. Jednakże, prawdopodobnie chcesz użyć zmiennej dla tego ID:
let positionId = // get the position ID somehow
axios.delete(`/job-management/${positionId}`, this.deletedata).then((res) => { ... })
URL w tej postaci umożliwia laravel aby przekierować DELETE prośbę do destroy()
metody kontrolera. Powyższy przykład używa ES6 template string literals, ponieważ kod w pytaniu sugeruje, że używamy wersji JavaScript obsługującej tę funkcję. Zwróć uwagę na rozmieszczenie lewostronnych (`
) wokół ciągu szablonów zamiast standardowych cudzysłowów.
"Chciałbym ustawić axios, aby usunąć' rekord' ... " , ale' $ positions' oznacza, że chciałbyś usunąć wiele rekordów? Czy możesz wyjaśnić, czy próbujesz usunąć pojedynczy zasób lub wiele zasobów? – Traxo
@CyRossignol Dzięki temu rozwiązano problem –