Я использую laravel и ajax. На домашней странице есть форма контакта, и я хочу, чтобы пользователь мог отправить эту форму без обновления страницы, но всегда получал эту внутреннюю ошибку сервера.
Я используюlaravel 5.8 и jquery, я пробовал решения, такие как использование другой версии jquery или включение csrf или нет, и все то же самое.
функция вставки в HomeController
public function contactForm(Request $request) {
$rules = [
'email' => 'required|email|unique:users',
'message' => 'required|string'
];
$this->validate($request, $rules);
if($request->fails()) {
$failed_output = [];
foreach ($request->getMessages()->messages() as $message) {
$failed_output[] = $message;
}
}else {
$data = $request->except('_token');
DB::table('user_messages')->insert($data);
$success_output = "<div class='alert alert-success'>We got your message, thank you.</div>";
}
$output = [
'success' => $success_output,
'error' => $failed_output,
];
return response()->json([
'success' => $success_output
], 200);
// echo json_encode($output);
}
мой маршрут
Route::post('/', 'HomeController@contactForm')->name('home');
html Форма
<form id="contactForm" autocomplete="off" method="post" action="/">
<span id="form_output"></span>
<div class="form-group">
<input id="email" placeholder="Your email..." value="@auth {{ auth()->user()->email }} @endauth" type="email" name="email" class="form-control" required>
<p class="home-email-input js-error">Email is not valid</p>
@if($errors->has('email'))
<div class="alert alert-danger">
{{ $errors->first('email') }}
</div>
@endif
</div>
<div class="form-group">
<textarea id="message" placeholder="Tell us why you like this website..." name="message" class="form-control" required></textarea>
<p class="home-message-input js-error">You message must be between 10 - 500 characters.</p>
@if($errors->has('message'))
<div class="alert alert-danger">
{{ $errors->first('message') }}
</div>
@endif
</div>
<input type="submit" class="btn btn-primary float-right" value="Send">
</form>
код JavaScript (вызов ajax)
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
$("#contactForm").submit(function(evt) {
evt.preventDefault();
let email = $("#contactForm div #email").val();
let msg = $("#contactForm div #message").val();
if(email.length < 10) {
$("#contactForm div p.home-email-input").css("display", "block");
return false;
}
if(msg.length < 10 || msg.length > 500) {
$("#contactForm div p.home-message-input").css("display", "block");
return false;
}
// Insert By Ajax
let form_data = $(this).serialize();
console.log(form_data);
$.ajax({
method: 'POST',
url: "/",
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
data: form_data,
dataType: 'json',
success: function(data) {
if(data.error.length > 0) {
let errors = "";
for(let i = 0; i < data.error.length; i++) {
errors += "<div class='alert alert-danger'>"+data.error[i]+"</div>";
}
$("#form_output").html($errors);
}else {
$("#form_output").html(data.success);
$("#contactForm")[0].reset();
}
},
});
});
Я хочу, чтобы результатом было небольшое сообщение об успехе над входом, но я получил эту ошибку:
POST http://127.0.0.1:8000/ 500 (Внутренняя ошибка сервера)