Я не могу вставить данные, используя ajax в Laravel, я всегда получаю 500 внутренних ошибок сервера и не знаю почему? - PullRequest
0 голосов
/ 25 октября 2019

Я использую 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 (Внутренняя ошибка сервера)

1 Ответ

0 голосов
/ 25 октября 2019

Illuminate\Http\Request не имеет fails метода, который будет вызываться для экземпляра Validator.

Когда вы вызываете $this->validate(...) в вашем контроллере, который выдаст исключение, еслипроверка не пройдена, вам нечего проверить в контроллере. Если выполнение продолжилось после $this->validate(...), это означает, что проверка прошла успешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...