Laravelコントローラーでnullを与えるAjax投稿[重複]

受付中 プログラミング
2024-12-24
小次郎又三郎
私はlaravelアプリで並べ替え可能なテーブルを作成しようとしていますが、データベースで順序も更新する必要があります。jquery、ajaxを使用して作成しようとしています。 私はこのコードでそれを理解しようとしました: JQuery / Ajax
        $(document).ready(function () {
                $('table tbody').sortable({
                    update: function (event, ui) {
                        $(this).children().each(function (index) {
                            if ($(this).attr('data-position') != (index + 1)) {
                                $(this).attr('data-position', (index + 1)).addClass('updated');
                            }
                        });
        
                        saveNewPositions();
                    }
                });
            });
        
            function saveNewPositions() {
                var positions = [];
                $('updated').each(function () {
                    position.push([$(this).attr('data-index'), $(this).attr('data-position')]);
                    $(this).removeClass('updated');
                });
        
                $.ajaxSetup({
                    headers: {
                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                    }
                });
        
                $.ajax({
                    url: 'cursos',
                    method: 'POST',
                    dataType: 'text',
                    data: {
                        'updated': 1,
                        'positions': positions,
                        '_token': '{{ csrf_token() }}'
                    },
                })
        
次に、web.phpで投稿ルートを作成しました。
        Route::post('/cursos', function (Request $request){
        return SectionCourseController::updateOrder($request);})->name('post');
        
私のコントローラーで、この関数を作成しました。
                public static function updateOrder(Request $request)
        {
            var_dump($request->positions);
            foreach ($request->positions as $position) {
                $index = $position[0];
                $newPosition = $position[1];
                $seccion = SectionCourse::findOrFail($index);
                $seccion->order = $newPosition;
                $seccion->save();
            }
        
            return response('success', 200);
        }
        
注文を更新しようとすると、コンソールで500のエラー(内部サーバーエラー)が発生します。
        [2022-06-14 14:16:18] local.ERROR: foreach() argument must be of type array|object, null given {"userId":1,"exception":"[object] (ErrorException(code: 0): foreach() argument must be of type array|object, null given
        
Ajaxで何か悪いことをしているとすみません、これは私がAjaxで何かをしようとするのは初めてです。
回答一覧
500エラーは、ほとんどすべてのPHPエラーをカバーする非常に一般的なエラーです。サーバーのエラーログとLaravelのログインを確認してくださいstorage/logs。詳細情報が表示されます。findOrFailモデルが見つからない場合にエラーが発生するのではないかと思います。
小次郎又三郎
ありがとう@anyber私はあなたが各エラーのログをチェックできることを知りませんでした
小次郎又三郎
Laravelにはリクエストに応じた機能があるので、を使用する必要はありません$_POST。代わりに、を使用request()->get('positions')して関数にリクエストを挿入してみてください。updateOrder(Request $request)$request->get('positions')
小次郎又三郎
dataType: 'text',javascriptオブジェクトを設定してから属性として追加すると、positions: positions,どのように変換されると思いますか?オブジェクトからテキストへのJS変換である$request->get('positions')テキストを返します。[object Object]json dataTypeを使用するか、オブジェクトを文字列化してから、コントローラーでjsonデコードします。
小次郎又三郎
私はこれと非常によく似た処理を行ったので、今のところ、最初にcsrfトークンが欠落しているので、ビューで、それぞれ$('updated')を宣言するコードの下にこれを追加します。
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        
        $.ajax({
            method: 'POST',
            dataType: 'json',
            url: 'cursos', // No {{}} needed here
            data: {
                update: 1,
                orders: orders,
                 _token: '{{ csrf_token() }}'
             },
        });
        
次に、コントローラーが混乱します。したがって、少なくともいくつかのlaravelsの書き込み標準に合うように書き直してください。このようなもの
        public function updateOrder(Request $request)
        {
            foreach ($request->positions as $position) {
                $index = $position[0];
                $newPosition = $position[1];
                $seccion = SectionCourse::findOrFail($index);
                $seccion->order = $newPosition;
                $seccion->save();
            }
        
            return response('success', 200);
        }
        
また、.sortableを宣言するときに以下を追加します
        axis: 'y',
        containment: 'parent',
        update: ...
        
小次郎又三郎
各ページまたはマスターレイアウトにメタタグを追加します
            <meta name="csrf-token" content="{{ csrf_token() }}"> and add to your js page
        
         $.ajaxSetup({
          headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          }
        
        });
        
内部にデータを追加することを忘れないでください
        $.ajax({
        url: "test",
        type:"POST",
        data: { '_token': token, 'someOtherData': someOtherData },
        
小次郎又三郎
500内部サーバーエラーには2つのケースがあります ajaxを介してリクエストを送信するときに、{csrf}トークンをそこに配置していませんでした。 ajaxを介して応答を送信するときに新しいFormData()オブジェクトを使用し、これらのパラメーターをprocessData:false、contentType:false、type:'POST'で使用します
小次郎又三郎
csrfが欠落していると、500ではなく419のエラーが返されます。
小次郎又三郎
はい、訂正してくれて本当にありがとうございますが、2番目のケースのFormData()がケースになるはずです
小次郎又三郎