🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1336閲覧

[laravel]Todoリストにてカラムごとに表示されているボタンの表示内容を変更したい

tanoken729

総合スコア1

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/01/13 14:24

編集2021/01/13 15:15

前提・実現したいこと

下記イメージのように作業中ボタンを押した時に完了ボタンになり、完了ボタンを押した時に作業中になるような機能追加を考えています。
完成イメージ

発生している問題

以下のことから削除処理が優先して行われてしまう

  • 削除処理も更新処理も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

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

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

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

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

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

guest

回答1

0

ルート定義メソッドを修正して解決?
一応意図した挙動にはなった

参照

使用可能なルート定義メソッドの部分
https://readouble.com/laravel/5.8/ja/routing.html
FormからPUT、PATCH、DELETEリクエストを送る方法(Laravel)
https://qiita.com/kambe0331/items/ff49b175ea9d8edec8c9
POSTとPUTとPATCHの使い分けについて
https://teratail.com/questions/193410

<?php /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/login', 'LoginController@index'); Route::get('/register', 'RegisterController@index'); Route::post('/register', 'RegisterController@post'); Route::get('todos','TodosController@index'); Route::post('todos','TodosController@store'); Route::patch('/todos/{id}','TodosController@update'); Route::delete('/todos/{id}','TodosController@remove');
@extends('layouts.parents') @section('title', 'Todoリスト') @section('content') @if(count($errors) > 0) <div> <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <h1>Todoリスト</h1> <label><input type="radio" checked>すべて</label> <label><input type="radio">作業中</label> <label><input type="radio">完了</label> <table> <tr> <th>ID</th> <th>コメント</th> <th>状態</th> </tr> @foreach($todos as $todo) <tr> <!-- findで検索されたIDを取得 --> <input type="hidden" name="id" value="{{$todo->id}}"> <td>{{$loop->iteration}}</td> <td>{{$todo->comment}}</td> @if($todo->state > 0) <form action="{{url('/todos', $todo->id)}}" method="POST"> @method('PATCH') @csrf <!-- 作業中ボタン --> <td><input type="submit" value="作業中"></td> <input type="hidden" name="state" value="0"> </form> @else <form action="{{url('/todos', $todo->id)}}" method="POST"> @method('PATCH') @csrf <!-- 完了ボタン --> <td><input type="submit" value="完了"></td> <input type="hidden" name="state" value="1"> </form> @endif <form action="{{url('/todos', $todo->id)}}" method="POST"> @method('DELETE') @csrf <!-- 削除ボタン --> <td><button type="submit">削除</button></td> </form> </tr> @endforeach </table> <h1>新規タスクの追加</h1> <form action="todos" method="POST"> @csrf <input type="text" name="comment" value="{{old('comment')}}"> <!-- 追加ボタン --> <input type="submit" value="追加"> </form> @endsection
<?php namespace App\Http\Controllers; use App\Todo; use Illuminate\Http\Request; use App\Http\Requests\TodoRequest; class TodosController extends Controller { //DBにあるレコードを表示する public function index(Request $request) { $todos =Todo::all(); return view('todos.index', ['todos' => $todos]); } //レコードを追加する public function store(TodoRequest $request) { $todo = new Todo; $form = $request->all(); unset($form['_token']); $todo->fill($form)->save(); return redirect('todos'); } //stateを更新する public function update(Request $request) { Todo::find($request->id) ->update(['state' => $request->state]); return redirect('todos'); } // レコードを削除する public function remove(Request $request) { Todo::find($request->id) ->delete(); return redirect('todos'); } }

投稿2021/01/13 16:39

編集2021/01/13 16:46
tanoken729

総合スコア1

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

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

tanoken729

2021/01/27 10:12 編集

上記の方法はRestful様に取っておきたいので、URLの分岐を行いました。 Route::post('/todos/state/{id}','TodosController@changeState'); Route::delete('/todos/{id}','TodosController@remove');
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問