質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.48%

laravel 投稿を編集できない、ページの移行

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 795

score 23

更新機能を制作していているのですが、投稿の編集ページにて編集すると編集されず、404not foundページに移行してしまいます。
なぜ、編集できないのかとpost/editに移行してしまうのかをアドバイスを貰いたいですです。

編集ページ
8000/post/1/edit

編集後
8000/post/edit

index.blade.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\PostRequest;

use App\Models\Post;
use Image;
use Auth;

class PostController extends Controller
{
    //アクセス制限、投稿を見るだけ
    public function __construct()
    {
        $this->middleware('auth')->except(['index']);
    }

    public function index()
    {
        $items = Post::with('user')->get();

        return view('post.index', compact('items'));
    }

    public function store(PostRequest $request)
    {
        $post = new Post;
        $post->title = $request->title;
        $post->body = $request->body;
        $post->user_id = $request->user()->id;//postのuser_id取得

        //ファイルが存在しているか
        if($request->hasFile('path')){
            $file = $request->file('path');//ファイルを取得
            $filename = time() . $file->getClientOriginalName();//ファイル名取得
            Image::make($file)
                ->resize(300, 300)
                ->save(public_path( 'storage/post_image/' . $filename ));
            $post->path = $filename;
        }
        $post->save();

        return redirect('/post')->with('success', '投稿しました!');
    }

    public function show($id)
    {
        // DBよりURIパラメータと同じIDを持つPostの情報を取得
        // post->comenntsでリレーションを取得して並び替え
        $post = Post::findOrFail($id);
        $comments = $post->comments()->orderBy('created_at', 'desc')->get();
        $likes = $post->likes()->where('user_id', Auth::user()->id)->first();
        return view('post.show', compact('post', 'comments', 'likes'));
    }

    public function edit($id)
    {
        $item = Post::findOrFail($id);
        // $post = Post::with('comment')->findOrFail($id);
        return view('post.edit', compact('item'));
    }

    public function update(Request $request)
    {
        $items = Post::findOrFail($request->id);
        $items->title = $request->title;
        $items->body = $request->body;
        $items->user_id = $request->user()->id;//postのuser_id取得

        if ($request->file('path')->isValid()) {
            Storage::delete('public/post_image/' . $items->image);//元の画像を削除
            $file = $request->file('path');
            $filename = time() . '.' . $file->getClientOriginalName();
            Image::make($file)
                ->resize(300, 300)
                ->save( public_path('public/post_image/' . $filename ) );

            $items->file = $filename;
        }
        $items->save();

        return redirect()->with('success', '更新しました');
    }
}

edit.blade.php

@extends('layouts.app')
@section('title', '投稿アプリ')

@section('content')
    @section('maincopy', '投稿してください')

  <section class="jumbotron text-center">
    <div class="container">
      <h1 class="jumbotron-heading">編集ページ</h1>
      <p class="lead text-muted">編集してください。</p>

      <!-- successメッセージ -->
      @if (session('success'))
      <div class="alert alert-success">
        {{ session('success') }}
      </div>
      @endif

      <!-- エラー -->
      @if ($errors->any())
        <div class="alert alert-danger">
        <ul>
        @foreach ($errors->all() as $error)
            <li>{{ $error }}</li>
        @endforeach
        </ul>
        </div>
      @endif

      <!-- form -->
      {{ Form::open(['action' => 'PostController@update', 'method' => 'post' , 'enctype' => 'multipart/form-data']) }}
        <p>タイトル<br/>{{ Form::text('title', '', ['id' => 'title', 'size' => 50]) }}</p>
        <p>内容<br/>{{ Form::textarea('body', '', ['id' => 'body', 'size' => '50x3']) }}</p>
        {{ Form::file('path') }}
        {{ Form::hidden('id', '$item->id')}}
        <div>
            {{ Form::submit('編集', ['class' => 'btn btn-success btn-lg']) }}
        </div>
      {{ Form::close() }}
    </div>
  </section>

    <!-- 投稿表示部分 -->
  <div class="album py-5 bg-light">
      <div class="container">
      <div class="row">
          <div class="col-md-4">
          <div class="card mb-4 shadow-sm">

              <img src="{{ asset('storage/post_image/' . $item->path) }}" class="index-imag">

              <div class="card-body">
              <p class="card-text">{{ $item->user->name }}</p>
              <p class="card-text">{{ $item->title}}</p>
              <p class="card-text">{{ $item->body}}</p>
              <div class="d-flex justify-content-between align-items-center">

                  <div class="btn-group">
                      <button type="button" class="btn btn-sm btn-outline-secondary">編集</button>
                      <button type="button" class="btn btn-sm btn-outline-secondary">削除</button>
                  </div>

                  <!-- コメント -->
                      <i class="far fa-comment"></i>
                      @if ($item->comments->count())
                          {{ $item->comments->count() }}
                      @endif
                  </a>

                  <!-- いいね -->
                  <a href="{{ route('post.show', [$item->id]) }}">
                      <i class="far fa-heart"></i>
                      @if ($item->likes->count())
                          {{ $item->likes->count() }}
                      @endif
                  </a>

                  <small class="text-muted">{{ $item->created_at}}</small>
              </div>
              </div>
          </div>
          </div>
      </div>
    </div>
  </div>
@endsection

web.php

Route::resource('post', 'PostController');
Route::resource('commnet', 'CommentController');

Route::get('post/edit', 'PostController@edit');
Route::post('post/edit', 'PostController@update');
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

こんにちは!
見当違いだったら申し訳ないのですが、気になったことがあるのでコメントさせていただきます。

PostControllerupdate内の一番最後の行が気になりました。

return redirect()->with('success', '更新しました');

とあるのですが、リダイレクト先の指定がないことが気になりました。

return redirect()->route('post.show');

↑の書き方だと、詳細ページにリダイレクトされるはずです。

こちらのページを参考に、適切なリダイレクト先を設定してあげるといいかなとおもいます!
(バージョンが違ったらすみません!)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る