質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

791閲覧

laravel でjavascriptのfetchAPIをつかってajax処理(delete処理)をしようと試みてますがエラーがでます。

tou.23.bc

総合スコア50

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2022/10/14 14:01

編集2022/10/14 14:50

laravel でjavascriptのfetchAPIをつかってajax処理をしようと試みています。
具体的には☓じるしを押すとタイトルが消えるようにしたいと考えています。

バツじるしを押すと以下のエラーが出ます。しかしテーブルからレコードが削除されません。

POST http://localhost:8573/posts/7/destroy 405 (Method Not Allowed)

(追記です)
ajaxを使用せずにdelete処理を行うときには
{{ route('posts.destroy', $post) }}のように$post(ORMであるeloquent)をおくっているので、ajaxの場合も同じく$postを送るひつようがあるのかなと思いました。しかしいろいろと調べているのですが、どうすればlaravelのmodelのオブジェクトをjavascriptに変数として渡せばよいのかわかりません。

以下画像です。
イメージ説明
以下ソースコードです。

index.blade.php

1 <ul> 2 @forelse ($posts as $post) 3 <li> 4 <div class="title-container"> 5 <form method="post" action="{{ route('posts.checked', $post) }}"> 6 @method('PATCH') 7 @csrf 8 <input type="checkbox" {{ $post->is_done ? 'checked' : ''; }}> 9 </form> 10 <a href="{{ route('posts.show', $post) }}" class="{{ $post->is_done ? 'done' : ''; }}"> 11 <span>{{ $post->title }}</span> 12 </a> 13 </div> 14 15 {{-- ajax 用のdeleteボタン--}} 16 <span class="delete" data-id="{{ $post->id }}">「x」</span> 17 </li> 18 @empty 19 <li>No posts yet!</li> 20 @endforelse 21 </ul> 22 23 <script> 24 25 const deletes = document.querySelectorAll('.delete'); 26 deletes.forEach(span => { 27 const postid = span.dataset.id; 28 span.addEventListener('click', () => { 29 30 fetch('/posts/'+ postid + '/destroy', { 31 method: 'POST', 32 }); 33 34 span.parentNode.remove(); 35 }) 36 37 }); 38 </script>
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Post; use App\Http\Requests\PostRequest; class PostController extends Controller { public function index() { $posts = Post::latest()->get(); return view('index') ->with(['posts' => $posts]); } public function show(Post $post) { return view('posts.show') ->with(['post' => $post]); } public function destroy(Post $post) { $post->delete(); return redirect() ->route('posts.index'); }

web.php

1Route::get('/', [PostController::class, 'index']) 2 ->name('posts.index'); 3 4Route::get('/posts/{post}', [PostController::class, 'show']) 5 ->name('posts.show') 6 ->where('post', '[0-9]+'); 7 8Route::delete('/posts/{post}/destroy', [PostController::class, 'destroy']) 9 ->name('posts.destroy') 10 ->where('post', '[0-9]+');

今回の質問とあまり関係ないコードは省略しています。

https://laraweb.net/tutorial/10817/
こちらの方のサイトを拝見したのですが、自分の今の方針とは書き方が異なっていているので
今の僕の書き方でうまく動作させたいと思っています。

LInuxのdockerで開発しています。
よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

基本ができてないのに先のことやろうとするから間違える。
まずは普通のformでの削除から。

<form method="post" action=""> @method('DELETE') @csrf </form>
  • ルーティングとformのmethodを合わせる。formの段階でここを間違えてる質問が大量。最初に覚える基本。
  • ブラウザのformはgetとpostしかできないのでそれ以外は@methodを使う、はLaravelの知識
  • GET,POST,DELETEとは何かはLaravel使う前に身に付けておく知識
  • JSは直接deleteが使える
  • formでもJSでも送信しているリクエストはほとんど同じ。どんなリクエストが送信されているかを理解してないとJSで書き換えられない。

投稿2022/10/14 21:54

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tou.23.bc

2022/10/14 22:44

ありがとうございます。 methodをdeleteにしてかつcsrfの記述が必要だったみたいです。 ベストアンサーとさせていただきます。
tou.23.bc

2022/10/14 22:45

ありがとうございました。
guest

0

php

1 fetch('/posts/'+ postid + '/destroy', { 2 method: 'POST', 3 });

POST 指定してるけど、

Route::delete('/posts/{post}/destroy', [PostController::class, 'destroy']) ->name('posts.destroy') ->where('post', '[0-9]+');

ご自身で、DELETE を指定してるじゃない。

投稿2022/10/14 18:29

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tou.23.bc

2022/10/14 21:42

ご回答いただきありがとうございます。ごしてきの通りpost,deleteのそれぞれに統一してためしましたがうまくいきませんでした。
phper.k

2022/10/14 22:37

まずは通しでリファレンス読んでください。 ロシアンルーレットにたいに当てずっぽうな対処しても時間の無駄です。
phper.k

2022/10/14 22:48

メソッドを統一した時でもうまくは行かないが、エラーメッセージは変わっているはず。 そこに気づいていないのはまずい
tou.23.bc

2022/10/14 23:12

りょうかいしました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問