環境:Lravel6 /PostgreSQL
resourceコントローラーを作成し、新規投稿の作成、投稿の削除機能は実装できました。
しかし、投稿の編集を行い保存をすると、投稿の上書きではなく、新規投稿として保存されてしまいます。
ルート(web.php)の設定は以下のようにしています。
PHP
1Route::resource('/post', 'PostController');
editメソッド、updateメソッドを記述している、コントローラー(PostController.php)のコード
PHP
1 2 public function edit(Post $post) 3 { 4 return view('post.edit',compact('post')); 5 } 6 7 public function update(Request $request, Post $post) 8 { 9 $inputs=$request->validate([ 10 'title'=>'required|max:255', 11 'image'=>'required|max:1024' 12 ]); 13 14 $post=new Post(); 15 //name属性titleで送られてきた情報をバリデーションルールを通過させてpostsテーブルのtitleに代入 16 $post->title=$inputs['title']; 17 18 //ログインしているユーザーのIDをuser_idに代入 19 $post->user_id=auth()->user()->id; 20 21 //name属性imageで送られて来たファイル名前を取得し、$originalに代入 22 $original=request()->file('image')->getClientOriginalName(); 23 $name=date('Ymd_His').'_'.$original; 24 $file=request()->file('image')->move('storage/images',$name); 25 $post->image=$name; 26 27 //上記の状態で$postを保存 28 $post->save(); 29 //処理が終わると'message'を表示してreturn back 30 return back()->with('message','画像を更新しました'); 31 } 32
投稿の編集画面(edit.blade.php)のコード
PHP
1{{-- edit.blade.php --}} 2@extends('layouts.app') 3@section('content') 4 <div class="container"> 5 <div class="row justify-content-center text-center"> 6 @if($errors->any()) 7 <div class="alert alert-danger"> 8 <ul> 9 @foreach($erros->all() as $error) 10 <li>{{$error}}</li> 11 @endforeach 12 </ul> 13 </div> 14 @endif 15 <div class="col-md-8"> 16 @if (session('message')) 17 <div class="alert alert-success">{{ session('message') }}</div> 18 @endif 19 <h1 class="mt4">投稿の編集</h1> 20 <form method="post" action="{{route('post.update', $post)}}" enctype="multipart/form-data"> 21 @csrf 22 @method('put') 23 <div class="form-group"> 24 <div> 25 @if($post->image) 26 <img src="{{ asset('storage/images/'.$post->image)}}" 27 class="img-fluid rmx-auto d-block"> 28 @endif 29 </div> 30 <label for="image">画像(1MBまで)</label> 31 <div class="col-md-6"> 32 <input id="image" type="file" name="image"> 33 </div> 34 </div> 35 <input type="text" name="title" class="form-control" id="title" value="{{old('title',$post->title)}}" placeholder="Enter Title"> 36 <button type="submit" type="file" class="btn btn-succsess">保存する</button> 37 </form> 38 <a href="{{ route('home')}}">投稿一覧へ移動</a> 39 </div> 40 </div> 41 </div> 42@endsection 43
上記コードで、edit.blade.php の「保存する」ボタンをおすと、新規投稿として、データベースに保存されます。
edit.blade.php、<form>タグの下で @method('put')とHTTPメソッドのPUT/PATCHを指定し、リソースコントローラーのupdateメソッドに保存する内容を記述しています。
しかし、なぜ投稿の更新。ではなく、新規投稿として、データベースに保存されてしまうのでしょうか?
HTTPメソッドを @method('patch')に書き換えても症状は変わりませんでした。
回答1件
あなたの回答
tips
プレビュー