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

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

詳細はこちら
Laravel

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

1回答

5078閲覧

Undefined variable: 変数 というエラーが解決できない

Tony-Aaron

総合スコア22

Laravel

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2021/02/09 09:09

編集2021/02/09 09:31

前提・実現したいこと

Twitter風の投稿サイトを作成中です。
index.blade.phpに投稿内容が表示されるようになっています。そこに投稿の詳細をクリックできるようになっています。
show.blade.phpという投稿の詳細のページに遷移するとUndefined variable: 変数というエラーが出て解決できません。変数を渡せたらUser-ID タイトル 投稿内容の詳細 投稿時間が全て表示されるようになっています。

発生している問題・エラーメッセージ

Undefined variable: review (View: /Applications/MAMP/htdocs/Online-Reviews/resources/views/online-reviews/show.blade.php)

イメージ説明
イメージ説明

該当のソースコード

online-reviews/index.blade.php こちらが投稿内容を一覧に表示できるページ @foreach ($reviews as $review) <div class="posted-table"> <div class="posted-header"> <div class="user-id">User-ID {{ $review->user_id }}</div> <div class="title">タイトル {{ $review->title}}</div> </div> </div> <div class="text-container">投稿内容 <div class="text">{!! nl2br(e(Str::limit($review->text, 100))) !!}</div> <a href="{{ route('online_reviews.show',[$review->text]) }}">投稿の詳細を読む</a> </div> <div class="date-container"> <span class="date"> 投稿日時 {{ $review->created_at }} </span> </div> @endforeach
online-reviews/show.blade.php 投稿の詳細ページになります。 <div class="content"> <div class="list-box"> <div class="list-container"> <div class="hospital-name">A病院</div> <div class="address-name">大阪府大阪市</div> </div> @foreach ((array) $review as $review)) //こちらがエラー箇所です <div class="posted-table"> <div class="posted-header"> <div class="user-id">User-ID {{ $review->user_id }}</div> <div class="title">タイトル {{ $review->title}}</div> </div> </div>
OnlineReviewsController.php public function index() { { $reviews =DB::table('online_reviews') ->select('title','text','user_id','created_at') ->orderBy('created_at','desc')// 登録日時の順序を設定できる laravel公式にてクエリビルダにある。 ->paginate(5); //メソッドチェーンのget return view('online-reviews.index',compact('reviews')); } } public function show($id) { $review = OnlineReviews::find($id); // dd($id); return view('online-reviews.show',compact('review')); }

試したこと

コントローラーのcompactの変数の渡し方は間違っていないと思います。
そうなれば、web.phpで値が渡れていないのでshow{id}を下記のように変数しました。Route::get('show/{id}', 'OnlineReviewsController@show')->name('online_reviews.show');

Route::get('show/{id}',function($id){return view('online-reviews.show');},'OnlineReviewsController@show')->name('online_reviews.show');に変更しました。

Route::get('show/{id}', 'OnlineReviewsController@show')->name('online_reviews.show');

このまま変更しなければ下記のスクショみたいにURLに投稿内容が表示されページには表示されません。
イメージ説明
しかし、それでも変数が渡されていない状況です。

web.php //OnlineReviewsのルーティングと // ログインしないとページに遷移できないようにmiddlewareを記述 Route::group(['prefix' => 'online_reviews','middleware' => 'auth'], function(){ Route::get('index','OnlineReviewsController@index')->name('online_reviews.index'); // 投稿一覧表 Route::get('create','OnlineReviewsController@create')->name('online_reviews.create');//投稿ページの表示 Route::post('store','OnlineReviewsController@store')->name('online_reviews.store');//投稿を保存するルーティング Route::get('show/{id}',function($id){return view('online-reviews.show');},'OnlineReviewsController@show')->name('online_reviews.show'); }); //Route::get('show/{id}', 'OnlineReviewsController@show')->name('online_reviews.show');元々のコードはこちらになります。これを上記のように変更しました。 //shopのルーティング Route::group(['prefix' => 'shop'],function(){ Route::get('index','ShopController@index')->name('shop.list'); Route::get('show','ShopController@show')->name('shop.show');//お店の詳細を確認する });

補足情報(FW/ツールのバージョンなど)

laravel6.20

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

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

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

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

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

guest

回答1

0

online_reviews.show のルートの記述に誤りがあり、コントローラのアクションが実行されていません。
以下のようにするとどうでしょうか。

php

1 Route::get('show/{id}', 'OnlineReviewsController@show')->name('online_reviews.show');

リンクの部分にも誤りがあり、textを渡してしまっています。idを渡すように修正しましょう。

online-reviews/index.blade.php

<a href="{{ route('online_reviews.show',[$review->id]) }}">投稿の詳細を読む</a>

投稿2021/02/09 09:16

編集2021/02/09 09:44
Lulucom

総合スコア1899

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

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

Tony-Aaron

2021/02/09 09:33

ご回答ありがとうございます。 申し訳ございませんが上記のルーティングに変更するとURLに投稿内容が表示されページそのものには何も表示されないエラーが出ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問