実現したいこと
HTTPメソッド | ルートパス | コントローラ | アクション | 説明
get | / | ContactController | index | 入力フォームの表示
post | /confirm | ContactController | confirm | 入力内容確認画面の表示
post | /thanks | ContactController | store | データ保存完了ページ表示
上記におけるデータ保存・完了ページ表示を実現したいです。
発生している問題・分からないこと
入力内容確認画面からpostメソッドでデータ保存完了ページにアクセスを試みると、以下のエラーメッセージが表示されました。
エラーメッセージ
error
1The GET method is not supported for this route. Supported methods: POST.
該当のソースコード
web.php
1<?php 2 3use Illuminate\Support\Facades\Route; 4use App\Http\Controllers\ContactController; 5 6Route::get('/',[ContactController::class, 'index']); 7Route::post('/confirm',[ContactController::class, 'confirm']); 8Route::post('/thanks',[ContactController::class, 'store']);
ContactController
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Http\Requests\ContactRequest; 6use App\Models\Contact; 7use App\Models\Category; 8 9class ContactController extends Controller 10{ 11 public function index() 12 { 13 $categories = Category::all(); 14 return view('index',compact('categories')); 15 } 16 17 public function confirm(ContactRequest $request) 18 { 19 $contact = $request->only(['first_name', 'last_name','gender','email', 'tell1','tell2','tell3', 'address','building','category_id','detail']); 20 $category = Category::find($contact['category_id']); 21 return view('confirm', compact('contact','category')); 22 } 23 24 public function store(ContactRequest $request) 25 { 26 $contact = $request->only(['first_name', 'last_name','gender','email', 'tell1','tell2','tell3', 'address','building','category_id','detail']); 27 Contact::create($contact); 28 return redirect('thanks'); 29 } 30} 31
confirm.blade.php(入力内容確認画面用viewファイル)
1// 中略 2 3@section('content') 4 <div class="confirm__content"> 5 <div class="confirm__heading"> 6 <h2>Confirm</h2> 7 </div> 8 <form class="form" action="/thanks" method="post"> 9 @csrf 10 <div class="confirm-table"> 11 <table class="confirm-table__inner"> 12 <tr class="confirm-table__row"> 13 <th class="confirm-table__header">お名前</th> 14 <td class="confirm-table__text"> 15 <p>{{ $contact['first_name'] }}</p> 16 <input type="hidden" name="first_name" value="{{ $contact['first_name'] }}"/> 17 <p>{{ $contact['last_name'] }}</p> 18 <input type="hidden" name="last_name" value="{{ $contact['last_name'] }}"/> 19 </td> 20 </tr> 21 <tr class="confirm-table__row"> 22 <th class="confirm-table__header">性別</th> 23 <td class="confirm-table__text"> 24 <p> 25 @php 26 switch($contact['gender']){ 27 case "1": 28 echo "男性"; 29 break; 30 case "2": 31 echo "女性"; 32 break; 33 case "3": 34 echo "その他"; 35 break; 36 } 37 @endphp 38 </p> 39 <input type="hidden" name="gender" value="{{ $contact['gender'] }}"/> 40 </td> 41 </tr> 42 <tr class="confirm-table__row"> 43 <th class="confirm-table__header">メールアドレス</th> 44 <td class="confirm-table__text"> 45 <p>{{ $contact['email'] }}</p> 46 <input type="hidden" name="email" value="{{ $contact['email'] }}"/> 47 </td> 48 </tr> 49 <tr class="confirm-table__row"> 50 <th class="confirm-table__header">電話番号</th> 51 <td class="confirm-table__text"> 52 <p>{{ $contact['tell1'] }}{{ $contact['tell2'] }}{{ $contact['tell3'] }}</p> 53 <input type="hidden" name="tell" value="{{ $contact['tell1'] }}{{ $contact['tell2'] }}{{ $contact['tell3'] }}"/> 54 </td> 55 </tr> 56 <tr class="confirm-table__row"> 57 <th class="confirm-table__header">住所</th> 58 <td class="confirm-table__text"> 59 <p>{{ $contact['address'] }}</p> 60 <input type="hidden" name="address" value="{{ $contact['address'] }}"/> 61 </td> 62 </tr> 63 <tr class="confirm-table__row"> 64 <th class="confirm-table__header">建物名</th> 65 <td class="confirm-table__text"> 66 <p>{{ $contact['building'] }}</p> 67 <input type="hidden" name="building" value="{{ $contact['building'] }}"/> 68 </td> 69 </tr> 70 <tr class="confirm-table__row"> 71 <th class="confirm-table__header">お問い合わせの種類</th> 72 <td class="confirm-table__text"> 73 <p>{{ $category['content'] }}</p> 74 <input type="hidden" name="category_id" value="{{ $contact['category_id'] }}"> 75 </td> 76 </tr> 77 <tr class="confirm-table__row"> 78 <th class="confirm-table__header">お問い合わせ内容</th> 79 <td class="confirm-table__text"> 80 <p>{!! nl2br(e($contact['detail'])) !!}</p> 81 <input type="hidden" name="detail" value="{{ $contact['detail'] }}"/> 82 </td> 83 </tr> 84 </table> 85 </div> 86 <div class="form__button"> 87 <button class="form__button-submit" type="submit">送信</button> 88 <a class="form__button-correction" href="#" onclick="event.preventDefault(); history.back();">修正</a> 89 </div> 90 </form> 91 </div> 92@endsection
ContactRequest(リクエストフォーム)
1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class ContactRequest extends FormRequest 8{ 9 public function authorize() 10 { 11 return true; 12 } 13 14 public function rules() 15 { 16 return [ 17 'first_name' => ['required'], 18 'last_name' => ['required'], 19 'gender'=>['required','in:1,2,3'], 20 'email' => ['required', 'email',], 21 'tell1' => ['required','digits_between:1,5'], 22 'tell2' => ['required','digits_between:1,5'], 23 'tell3' => ['required','digits_between:1,5'], 24 'address'=>['required'], 25 'category_id'=>['required','exists:categories,id'], 26 'detail'=>['required','max:120'], 27 ]; 28 } 29 30 public function messages() 31 { 32 return [ 33 'first_name.required' => '姓を入力してください', 34 'last_name.required' => '名を入力してください', 35 'gender.required' => '性別を選択してください', 36 'email.required' => 'メールアドレスを入力してください', 37 'email.email' => 'メールアドレスはメール形式で入力してください', 38 'tell1.required' => '電話番号を入力してください', 39 'tell1.digits_between'=>'電話番号は5桁までの数字で入力してください', 40 'tell2.required' => '電話番号を入力してください', 41 'tell2.digits_between'=>'電話番号は5桁までの数字で入力してください', 42 'tell3.required' => '電話番号を入力してください', 43 'tell3.digits_between'=>'電話番号は5桁までの数字で入力してください', 44 'address.required'=>'住所を入力してください', 45 'category_id.exists'=>'お問い合わせの種類を選択してください', 46 'detail.required'=>'お問い合わせ内容を入力してください', 47 'detail.max'=>'お問い合わせ内容は120文字以内で入力してください', 48 ]; 49 } 50}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
○Route::get('/confirm',[ContactController::class, 'confirm']); を追記
→リダイレクトが繰り返し行われ、エラー
○バリデーションの確認
→バリデーションに失敗し、前の画面へリダイレクト(get)していた為ルーティングが見つからずエラーした可能性を考え、viewファイルにおけるバリデーション記述箇所をコメントアウトするも同エラー
(文字数の兼ね合いで投稿内容上に記載できていませんが、入力フォーム用のviewファイルにバリデーションを記述しています)
○デベロッパーツールで動作確認
→リクエストURL:http://localhost/confirm
リクエストメソッド:GET
ステータスコード:405 Method Not Allowed
補足
特になし
