#実現したい事
下記イメージのように「すべて」「作業中」「完了」ボタンを押下時にGETもしくはPOST送信を行いカテゴリー別にタスクを表示させたい。
イメージ
#やったこと
・ラジオボタン×3に対して3つのformを用意した。
・「すべて」に関してはGETでリダイレクトするのみの記述をした(動作済み)
・「作業中」ボタンに関しては押下時にPOST送信→新たなルーティングを追加してコントローラー側でdoneカラムが1のレコードのみを引っ張ってきてリダイレクトさせるようにした。(done()にて0:1の値を返しているのでそれを使用しようと考えた)
#困っていること
select_workingにURLは飛んでいるが
Call to a member function delete() on null
のエラーが出て今まで動いていたdelete()が無い事になっている。。。
何が必要なのでしょうか?
以下ソースコード
views/layouts/index.blade.php
<html> <head> <title>@yield('title')</title> <style> body { text-align: center; font-size: 16pt; color: #999; margin: 5px; } ul { font-size: 12pt; } hr { margin: 25px 100px; border-top: 1px dashed #ddd; } .menutitle { font-size: 25pt; font-weight: bold; margin: 0px; } .content { margin: 10px; } .footer { font-size: 20pt; margin: 10px; } th { background-color: #999; color: fff; padding: 5px 10px; } td { border: solid 1px #aaa; color: #999; padding: 5px 10px; } .text { display: none; } .text01 { display: block; } </style> </head> <body> <h1 class="menutitle"> Todoリスト3</h1> <div style="display:inline-flex" style="margin:0px;"> <form method=" GET" action="{{ url('Todo') }}" name="form1" style="margin:0px;"> @csrf <input type="radio" ... onclick="document.form1.submit();">すべて </form> <form method="POST" action="{{ url('Todo/select_working') }}" name="form2" style="margin:0px;"> @csrf <input type="radio" ... onclick="document.form2.submit();">作業中 </form> <form method="POST" action="{{ url('Todo') }}" name="form3" style="margin:0px;"> @csrf <input type="radio" ... onclick="document.form3.submit();">完了 </form> </div> <h2 style="margin:0px;">TASKを追加</h2> @if (count($errors) > 0) <ul> @foreach ($errors->all() as $error) {{ $error }} @endforeach </ul> @endif <form action="/Todo" method="post" style="margin:0px;"> @csrf <input type="text" name="comment" size="70" value="{{old('comment')}}"> <input type="submit" value="追加"> </form> <hr size="1"> <div class="content"> @yield('content') </div> <div class="footer"> @yield('footer') </div> <script> $(function() { $('[name="btn"]:radio').change(function() { if ($('[id=a]').prop('checked')) { $('.text').fadeOut(); $('.text01').fadeIn(); } else if ($('[id=b]').prop('checked')) { $('.text').fadeOut(); $('.text02').fadeIn(); } }); }); </script> </body> </html>
views/Todos/index.blade.php
@extends('layouts.index') @section('title','Todoリスト') @section('content') <table align="center"> <tr> <th>ID</th> <th>comment</th> <th>状態</th> </tr> @foreach ($items as $item) <tr> <td>{{$loop->iteration}}</td> <td>{{$item->comment}}</td> <td> <form action="{{ url('done/' . $item->id) }}" method="POST"> @csrf <button type="submit"> @if ($item->done === 0) <p>作業中</p> @else <p>完了</p> @endif </button> </form> </td> <td> <form action="{{ url('Todo/' . $item->id) }}" method="POST"> @csrf <button type="submit"> <p>削除</p> </button> </form> </td> </tr> @endforeach </table> @endsection
web.php
<?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('/Todo', 'TodoController@index'); Route::post('/Todo', 'TodoController@create'); Route::group(['middleware' => ['web']], function () { Route::post('/Todo', 'TodoController@create'); }); Route::post('/Todo/{table}', 'TodoController@delete'); Route::post('/done/{id}/', 'TodoController@done'); Route::post('/Todo/select_working/', 'TodoController@select_working');
TodoController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests\CreateTaskRequest; use Illuminate\Support\Facades\DB; use App\Todo; class TodoController extends Controller { public function index(Request $request) { $items = Todo::all(); return view('Todos.index', ['items' => $items]); } public function create(CreateTaskRequest $request) { $todo = new Todo; $form = $request->all(); unset($form['_token']); $todo->timestamps = false; $todo->fill($form)->save(); return redirect('/Todo'); } public function delete(Request $request) { Todo::find($request->table)->delete(); $items = Todo::all(); $items = DB::table('Todos')->orderBy('todo_id', 'asc')->get(); return redirect('/Todo'); } public function done($id) { $todo = Todo::find($id); $todo->done = ($todo->done) ? 0 : 1; $todo->save(); return redirect('/Todo'); } public function select_working(Request $request) { $working = Todo::where('done', 1)->get(); return redirect('/Todo'); } }
Todo.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Todo extends Model { protected $table = 'Todos'; protected $fillable = ['id', 'comment', 'todo_id', 'done']; public static $rules = array( 'comment' => 'required' ); }
回答1件
あなたの回答
tips
プレビュー