422 (необработанный объект) Ajax и Laravel - PullRequest
0 голосов
/ 21 апреля 2020

В своей жизни он встречался только ajax 2 раза, и здесь наши пути переплелись с ним, и он дал мне 422 ошибки. Я погуглил и понял, что ошибка 422 - это ошибка проверки, но в каком месте c разместить ошибку, я просто не могу понять.

Это мой скрипт

<script type="text/javascript">
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    $( "#form" ).submit(function( e ) {
        e.preventDefault();

        var message = $('#message').val();
        var img = $('#img').val();
        var user_id = $('#user_id').val();

        $.ajax({
            type: "POST",
            url: "{{route('profile.store', ['id' => Auth::user()->id])}}",
            data: {message:message, img:img, user_id:user_id},
            success: function (data) {
                $("#textpost").html($(data).find("#textpost").html());
            },
        });
    });
</script>

И мой Метод

public function store(Request $request) {
    $validator  = $this->validate($request,[
        'message' => 'required|max:1000',
        'img' => 'mimes:jpeg,png,gif|max:3000',
    ]);

    if($validator ) {
        $post = new Profile();
        $post->message = $request->message;
        $post->user_id = Auth::user()->id;

        if($request->file('img')) {
            $path = Storage::putFile('public', $request->file('img'));
            $url = Storage::url($path);
            $post->img = $url;
        }

        $post->save();
    }

    return redirect()->back();
}

И моя форма

<div class="card-header">
                            <div class="input-group">
                                <form action="{{route('profile.store', ['id' => Auth::user()->id])}}" method="post" enctype="multipart/form-data" id="form">
                                    @csrf
                                    <textarea class="form-control" id="message" name="message" cols="100" rows="4" placeholder="О чем думаешь?"></textarea>
                                    <input type="file" id="img" name="img" value="Прикрепить изображение" class="mt-2">
                                    <div class="text-right">
                                        {{--                                        <input type="submit" id="btn" value="Отправить" class="btn btn-outline-dark btn-sm mt-4">--}}
                                        <button type="submit" id="btn" class="btn btn-outline-dark btn-sm mt-4">Отправить</button>
                                    </div>
                                </form>
                            </div>
                        </div>

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Проблема с вашим вызовом Ajax связана с тем, что вы одновременно загружаете текст и файл и можете передать его через FormData. Вам также не хватало

       contentType: false,
       processData: false,

Вот обновленный вызов ajax:

<script type="text/javascript">
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    $( "#form" ).submit(function( e ) {
        e.preventDefault();

        var formData = new FormData(this); //set formData to selected instance 
        var message = $('#message').val();
        var img = $('#img').val();
        var user_id = $('#user_id').val();

        $.ajax({
            type: "POST",
            url: "{{route('profile.store', ['id' => Auth::user()->id])}}",
            data: formData, //pass to our Ajax data to send
            success: function (data) {
                $("#textpost").html($(data).find("#textpost").html());
            },
       contentType: false,
       processData: false,
        });
    });
</script>

Установка processData делает его так, чтобы ваши FormData не преобразовывались в строку. Установка для contentType значения false используется для форм, которые передают файлы. Если значение false, заголовок не будет добавлен к запросу, что именно то, что мы хотим при отправке multipart/form-data.

0 голосов
/ 21 апреля 2020
 $validator  = $this->validate($request,[
        'message' => 'required|max:1000',
        'img' => 'mimes:jpeg,png,gif|max:3000',
    ]);

Эта часть вашего кода вызывает исключение ошибок валидации, которое возвращает 422.

Если вы хотите sh самостоятельно обработать валидацию, попробуйте вместо этого логики c:

$validator = validator($request->all(), [
'message' => 'required|max:1000',
        'img' => 'mimes:jpeg,png,gif|max:3000',
]);

if($validator->fails()) {
// return as appropriate
return response()->son($validatior->errors(), 422);
}

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