前提・実現したいこと
下記イメージのように作業中ボタンを押した時に完了ボタンになり、完了ボタンを押した時に作業中になるような機能追加を考えています。
完成イメージ
発生している問題
以下のことから削除処理が優先して行われてしまう
- 削除処理も更新処理もidを渡して行っている
- 同じ画面にリダイレクトさせている
該当のソースコード
web.php
php
1<?php 2 3/* 4|-------------------------------------------------------------------------- 5| Web Routes 6|-------------------------------------------------------------------------- 7| 8| Here is where you can register web routes for your application. These 9| routes are loaded by the RouteServiceProvider within a group which 10| contains the "web" middleware group. Now create something great! 11| 12*/ 13 14Route::get('/', function () { 15 return view('welcome'); 16}); 17 18 19 20Route::get('/login', 'LoginController@index'); 21 22Route::get('/register', 'RegisterController@index'); 23Route::post('/register', 'RegisterController@post'); 24 25Route::get('todos','TodosController@index'); 26Route::post('todos','TodosController@store'); 27Route::post('/todos/{id}','TodosController@update'); 28Route::post('/todos/{id}','TodosController@remove'); 29
index.blade.php
php
1@extends('layouts.parents') 2 3@section('title', 'Todoリスト') 4 5@section('content') 6 @if(count($errors) > 0) 7 <div> 8 <ul> 9 @foreach($errors->all() as $error) 10 <li>{{ $error }}</li> 11 @endforeach 12 </ul> 13 </div> 14 @endif 15<h1>Todoリスト</h1> 16 <label><input type="radio" checked>すべて</label> 17 <label><input type="radio">作業中</label> 18 <label><input type="radio">完了</label> 19 <table> 20 <tr> 21 <th>ID</th> 22 <th>コメント</th> 23 <th>状態</th> 24 </tr> 25 @foreach($todos as $todo) 26 <tr> 27 <!-- findで検索されたIDを取得 --> 28 <input type="hidden" name="id" value="{{$todo->id}}"> 29 <td>{{$loop->iteration}}</td> 30 <td>{{$todo->comment}}</td> 31 @if($todo->state > 0) 32 <form action="{{url('/todos', $todo->id)}}" method="POST"> 33 @csrf 34 <!-- 作業中ボタン --> 35 <td><input type="submit" value="作業中"></td> 36 <input type="hidden" name="state" value="0"> 37 </form> 38 @else 39 <form action="{{url('/todos', $todo->id)}}" method="POST"> 40 @csrf 41 <!-- 完了ボタン --> 42 <td><input type="submit" value="完了"></td> 43 <input type="hidden" name="state" value="1"> 44 </form> 45 @endif 46 <form action="{{url('/todos', $todo->id)}}" method="POST"> 47 @csrf 48 <!-- 削除ボタン --> 49 <td><button type="submit">削除</button></td> 50 </form> 51 </tr> 52 @endforeach 53 </table> 54<h1>新規タスクの追加</h1> 55<form action="todos" method="POST"> 56 @csrf 57 <input type="text" name="comment" value="{{old('comment')}}"> 58 <!-- 追加ボタン --> 59 <input type="submit" value="追加"> 60</form> 61@endsection 62
TodosController.php
php
1<?php 2 3namespace App\Http\Controllers; 4 5use App\Todo; 6use Illuminate\Http\Request; 7use App\Http\Requests\TodoRequest; 8 9class TodosController extends Controller 10{ 11 //DBにあるレコードを表示する 12 public function index(Request $request) 13 { 14 $todos =Todo::all(); 15 return view('todos.index', ['todos' => $todos]); 16 } 17 18 //レコードを追加する 19 public function store(TodoRequest $request) 20 { 21 // $this->validate($request, Todo::$rules); 22 $todo = new Todo; 23 $form = $request->all(); 24 unset($form['_token']); 25 $todo->fill($form)->save(); 26 return redirect('todos'); 27 } 28 29 //state変換 30 // public function edit(Request $request) 31 // { 32 // $todos =Todo::all(); 33 // return view('todos.boolean', ['todos' => $todos]); 34 // } 35 36 public function update(Request $request) 37 { 38 Todo::find($request->id) 39 ->update(['state' => $request->state]); 40 return redirect('todos'); 41 } 42 43 // レコードを削除する 44 public function remove(Request $request) 45 { 46 Todo::find($request->id)->delete(); 47 return redirect('todos'); 48 } 49 50} 51
要件
- 同じURLに別のpost処理をルーティングしたい場合の対応についてアドバイスいただけないでしょうか。(特定のアクションにアクセスする方法も考えています。)
- また、そもそも可能なのでしょうか。
補足情報(FW/ツールのバージョンなど)
Laravel Framework 5.8.38
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/27 10:12 編集