I try to make an ajax request through JQuery triggering an onClick event, but when it sends the AJAX request I receive:
PATCH http://localhost:8000/courses 405 (Method Not Allowed) (Current page) Because it doesn’t get the URL with the id
HTML
@foreach ($courses as $course)
<tr>
<td>{{ Form::select('year', $years, ['class' => 'form-control'], [ 'placeholder' => $course->academicYear]) }}</td>
<td>{{ Form::select('subject', $subjects, ['class' => 'form-control'], [ 'placeholder' => $course->subject]) }}</td>
<td>
<a href="" id="saveCourse" class="btn btn-success pull-left">Save</a>
<input type="hidden" id="idCourse" value="{{ $course->id }}">
(...)
JQUERY + AJAX
$('#saveCourse').click(function(e){
e.preventDefault();
var id = $('#idCourse').val();
// Ignore this logic
var values = {year: "", subject:"", id: id};
var parameters = ['year', 'subject'];
var i = 0;
$('td > select option:selected').each(function() {
values[parameters[i]] = $(this).text();
i++;
});
// Ajax request
$.ajax({
type: 'patch',
// Appending the course id here not working,
// but if i put anything else like /blabla/ + id ajax doesn't ignore it...
url: '/courses/' + id,
headers: {'X-CSRF-Token': csrf_token},
dataType: 'json',
data: values,
success: function (response) {
console.log("SUCCESS: " + response);
},
error: function (reject) {
if( reject.status === 422 ) {
$("#error").text("Los datos dados no cumplen el formato requerido.");
}
}
});
});
WEB.PHP
/* -----COURSE_ROUTES------ */
Route::resource('courses', 'CourseController')->except([
'create', 'edit'
]);
EDIT
If I use POST
instead of PATCH
in type
AJAX gets the id.
Found a GitHub issue with the same problem https://github.com/jquery/jquery/issues/3944
4
Answers
I forgot to put this condition at the start of the update method in the controller... Now it works!
PUT and PATCH are request methods. An HTTP error of 405, which you get means that the server knows the request method, but the service does not support it. Read more here: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/405
not sure if matters but try PATCH instead of patch
As mentioned below the
405
(METHOD NOT ALLOWED) basically means you’re ajax request methodPATCH
is not allowed for the specific resource on the server.If you using a routing library you can go their docs and search how to change this behavior. A route can accept one or multiple request methods, I assume that the
Route::resource
create a route with methodPOST
by default, which explains that the ajax request works in POST type.