Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ログインユーザーのみ削除ボタンを表示させたい

解決したいこと

現在laravelでインスタグラムの簡易サイトを作っています。
投稿した写真を削除するボタンを実装したのですが、全てのユーザーのページで表示されてしまいます。
ログインユーザーのみ表示されるようにするにはどうしたら良いでしょうか。

Views

resources/views/posts/show.blade.php.php
@extends('layouts.app')

@section('content')


<div class="container">
  <div class="d-flex pt-3">
    <div class="col-8">
      <img src="/storage/{{ $post->image }}" class="w-100">
    </div>
    <div clas="col-4">
      <div>
        <div class="d-flex align-items-center">
          <div class="pe-3 ps-3">
            <img src="/storage/{{ $post->user->profile->image}}" class="rounded-circle w-100" style="max-width: 40px;">
          </div>
          <div>
            <div class="font-weight-bold d-flex">
              <a href="/profile/{{ $post->user->id }}">
                <span class="text-dark">{{ $post->user->username }}</span>
              </a>  |


              <div class="ps-3">
              <form onsubmit="return confirm('本当に削除しますか?')" action="{{ route('post.destroy', $post) }}" method="post">
                  @csrf
                  @method('delete')
                  <button type="submit" class="btn btn-outline-danger">削除</button>
              </form>
            </div>

          </div>
          </div>

        </div>

        <hr>

        <p>
          <span class="font-weight-bold">
            <a href="/profile/{{ $post->user->id }}">
              <span class="text-dark ps-3">{{ $post->user->username }}</span>
            </a>
          </span> <div class="ps-3">{{ $post->caption }}</div>
        </p>

        <hr>


      </div>

      <div class="d-flex align-items-center pe-3 ps-3">
              <div onclick="like({{$post->id}})"><i class="far fa-heart like-btn" ></i></div>
              <div onclick="unlike({{$post->id}})"><i class="fas fa-heart unlike-btn" style="display:none;"></i></div>
      </div>

      <hr>

    </div>
  </div>
</div>


@endsection
<script src="{{ asset('js/alert.js') }}"></script>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>

<meta name="csrf-token" content="{{ csrf_token() }}">

<link rel="stylesheet" href="{{ asset('/css/like.css')  }}" >

Models

Models/Post.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $guarded = [];

    public function user()
    {
      return $this->belongsTo(User::class);
    }

    public function likes()
    {
        return $this->hasMany(Like::class);
    }
    // 一覧画面
    public function getTimeLines(Int $user_id, Array $follow_ids)
    {
        // 自身とフォローしているユーザIDを結合する
        $follow_ids[] = $user_id;
        return $this->whereIn('user_id', $follow_ids)->orderBy('created_at', 'DESC')->paginate(50);
    }

    public function postDestroy(Int $user_id, Int $post_id)
{
    return $this->where('user_id', $user_id)->where('id', $post_id)->delete();
}


}

Controllers

Controllers/PostsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
use App\Models\Post;
use App\Models\Like;
use App\Models\Follower;
use Illuminate\Support\Facades\Auth;

class PostsController extends Controller
{
  public function __construct()
  {
    $this->middleware('auth');
  }

    public function create()
    {
      $user = auth()->user();
      return view('posts.create', [
      'user'      => $user
    ]);
    }

    public function index(Post $posts, Follower $follower)
    {
      $user = auth()->user();
       $follow_ids = $follower->followingIds($user->id);
       // followed_idだけ抜き出す
       $following_ids = $follow_ids->pluck('followed_id')->toArray();

       $timelines = $posts->getTimelines($user->id, $following_ids);

       return view('posts.timeline', [
           'user'      => $user,
           'timelines' => $timelines,
           'post' => $posts
       ]);
    }

    public function store()
    {
      $data = request()->validate([
        'caption' => 'required',
        'image' => ['required', 'image'],
      ]);

      $imagePath = request('image')->store('uploads', 'public');

      $image = Image::make(public_path("storage/{$imagePath}"))->fit(1200,1200);
      $image->save();

      auth()->user()->posts()->create([
        'caption' => $data['caption'],
        'image' => $imagePath,
      ]);
      return redirect('/profile/' . auth()->user()->id);
    }

    public function show(\App\Models\Post $post)
    {
      $user = auth()->user();

      return view('posts.show', compact('post'), [
       'user' => $user
        ]);
    }

    public function destroy(Post $post)
    {
        $post->delete();
        return redirect('/profile/' . auth()->user()->id);
    }

}

自分で試したこと

@if (auth()->user($user->id))など試しましたが、
どういったコードを書けばいいのか右も左もわからない状況なので教えていただきたいです。

0

1Answer

Comments

  1. @mechatuyoi

    Questioner

    @authで囲っても反映されませんでした。。。
  2. loginしてるんじゃないですか?
    対象ページのユーザのIDとログインユーザのIDが一致している場合のみ表示するように記述する必要があるのかと。
  3. @mechatuyoi

    Questioner

    コントローラーに$user_id = Auth::id(); と記載しログインユーザーを取得して、ビューで@if(Auth::id() === $post->user->id )でログインユーザーと一致したら削除ボタンを出現させるロジックで改善しました。

Your answer might help someone💌