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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1195閲覧

Laravel ローカルで動くアプリがHerokuにデプロイするとエラーが出る

neomana-39

総合スコア11

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2020/04/07 05:54

編集2020/04/08 06:22

前提・実現したいこと

Docker for Macを用いて、Laravelで作ったアプリをHerokuにデプロイしました。
ローカルでは通常通りの挙動をするのですが、Heroku上で開くとエラーが表示されます。
Heroku上でもローカルと同じように動作するようにしたいです。

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

heroku open

を打つと次のようなエラーメッセージが表示されます。

Undefined variable: profile (View: /app/resources/views/stories/index2.blade.php)

エラーメッセージ

該当のソースコード

resources/views/stories/Index2.blade.php

php

1@extends('layouts.front2') 2@section('title','mainpage') 3 4@section('content') 5 6<link rel="stylesheet" href="{{ asset('css/main2.css') }}"> 7 8<div class="profile"> 9 10 11 <div class="name"> 12 @guest 13 <a class="nav-link2" href="{{ route('register')}}">{{ __('Create Accout!')}}</a> 14 @else 15 <a id="navbarDropdown" class="nav-link2" href="#" role="button"> 16 {{ Auth::user()->name }}<span class="caret"></span></a> 17 <form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;"> 18 @csrf 19 </form> 20 @endguest 21 </div> 22 23<div class="aboutme"> 24 <tbody> 25 @foreach($posts as $profile) 26 <tr> 27 <td>{{ \Str::limit($profile->title, 100) }}</td> 28 <td>{{ \Str::limit($profile->body, 250) }}</td> 29 </tr> 30 <a href="{{ action('ProfileController@delete', ['id' => $profile->id]) }}">delete</a> 31 <a href="{{ action('ProfileController@update', ['id' => $profile->id]) }}" class="update">update</a> 32 @endforeach 33 34</tbody> 35<br> 36</div> 37</div> 38 39<div class="new"> 40 41 <div class="newtitle"> 42 <h1>New</h1> 43 </div> 44 45 <div class="container1"> 46 47 @foreach ($images as $image) 48 <img src="/storage/{{ $image->path . $image->name }}" class="images" style="height: 250px; width: 250px; border-radius: 50%;"> 49 <a href="{{ action('StoriesController@delete', ['id' => $image->id]) }}">delete</a> 50 @endforeach 51 52 <div class="more"> 53 more... 54 </div> 55 </div> 56 57</div> 58 59 60{{ csrf_field() }} 61@endsection

app/Http/Controllers/ProfileController

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Stories; use App\History; use App\Posts; use App\Profile; use Carbon\Carbon; use Storage; class ProfileController extends Controller { public function index(Request $request) { $cond_title = $request -> cond_title; if ($cond_title != ''){ $profile = Profile::where('title', $cond_title)->get(); } else { $profile = Profile::all(); } return view('stories.index2', ['profile' => $profile, 'cond_title' => $cond_title]); } public function upload(Request $request) { $this->validate($request, [ 'file' => [ 'required', 'file', 'image', 'mimes:jpeg,png', ] ]); if ($request->file('file')->isValid([])) { $path = $request->file->store('public'); return view('stories.index2')->with(compact('filename','plus')); } else { return redirect() ->back() ->withInput() ->withErrors(); } } public function store(Request $request) { $d = new \DateTime(); $d->setTimeZone(new \DateTimeZone('Asia/Tokyo')); $dir = $d->format('Y/m'); $path = sprintf('public/posts/%s', $dir); $data = $request->except('_token'); foreach ($data['plus'] as $k => $v) { $filename = ''; $posts = Posts::take(1)->orderBy('id', 'desc')->get(); foreach ($posts as $post) { $filename = $post->id + 1 . '_' . $v->getClientOriginalName(); } unset($post); if ($filename == false) { $filename = 1 . '_' . $v->getClientOriginalName(); } $v->storeAs($path, $filename); $post_data = [ 'path' => sprintf('posts/%s/', $dir), 'name' => $filename ]; $a = new Posts(); $a->fill($post_data)->save(); } unset($k, $v); return redirect('/'); } public function create(Request $request) { $this->validate($request, Profile::$rules); $profile = new Profile; $form = $request->all(); unset($form['_token']); $profile->fill($form)->save(); return redirect('/'); } public function add() { return view('profile.create2'); } public function index3() { return view('profile.create3'); } public function edit(Request $request) { $profile = Profile::find($request->id); if (empty($profile)) { abort(404); } return view('profile.create4', ['profile_form' => $profile]); } public function delete(Request $request) { // 該当するNews Modelを取得 $profile = Profile::find($request->id); // 削除する $profile->delete(); return redirect('/'); } public function update(Request $request) { $this->validate($request, Profile::$rules); $profile = Profile::find($request->id); $profile_form = $request->all(); unset($profile_form['_token']); $profile->fill($profile_form)->save(); return redirect('/'); } }

app/Http/Controllers/StoriesController.php

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Story; use App\Profile; use Auth; use App\Posts; use App\History; use App\Attachment; use Carbon\Carbon; use Storage; class StoriesController extends Controller { public function __construct() { $this->middleware('auth'); } public function index(Request $request) { $images = Attachment::all(); $cond_title = $request->cond_title; if ($cond_title != '') { // 検索されたら検索結果を取得する $posts = Profile::where('title', $cond_title)->get(); } else { // それ以外はすべてのニュースを取得する $posts = Profile::all(); } return view('stories.index2', compact('images','posts','cond_title')); } public function add() { return view('stories.create2'); } public function store(Request $request) { $d = new \DateTime(); $d->setTimeZone(new \DateTimeZone('Asia/Tokyo')); $dir = $d->format('Y/m'); $path = sprintf('public/images/%s', $dir); $data = $request->except('_token'); foreach ($data['images'] as $k => $v) { $filename = ''; $attachments = Attachment::take(1)->orderBy('id', 'desc')->get(); foreach ($attachments as $attachment) { $filename = $attachment->id + 1 . '_' . $v->getClientOriginalName(); } unset($attachment); if ($filename == false) { $filename = 1 . '_' . $v->getClientOriginalName(); } $v->storeAs($path, $filename); $attachment_data = [ 'path' => sprintf('images/%s/', $dir), 'name' => $filename ]; $a = new Attachment(); $a->fill($attachment_data)->save(); } unset($k, $v); return redirect('/'); } public function delete(Request $request) { // 該当するNews Modelを取得 $images = Attachment::find($request->id); // 削除する $images->delete(); return redirect('/'); } public function upload(Request $request) { $this->validate($request, [ 'file' => [ 'required', 'file', 'image', 'mimes:jpeg,png', ] ]); if ($request->file('file')->isValid([])) { $path = $request->file->store('public'); return view('stories.index2')->with('filename', basename($path)); } else { return redirect('/') ->back() ->withInput() ->withErrors(); } } }

試したこと

https://qiita.com/shosho/items/b31a4757e223e2261a27

こちらのサイトを参考にし、index2→Index2とファイル名を大文字に変更しました。

イメージ説明
よろしくお願いします。

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

MacOS Catalina 10.15.4
Docker for Mac version 2.2.0.5
PHP 7.3.11
Composer 1.9.1
heroku/7.39.2 darwin-x64 node-v12.13.0

ここにより詳細な情報を記載してください。

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

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

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

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

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

Lulucom

2020/04/08 00:41

> index2→Index2とファイル名を大文字に変更しました。 これが気になっています。Heroku上でstoriesディレクトリ配下にどんなBladeファイルがあるを知りたいので、以下のコマンドの結果も追記いただけますか? heroku run 'ls -1 resources/views/stories/'
Lulucom

2020/04/08 00:47

どのような操作をしたらそのエラーが起きるのかも追記いただけますか?どのアクションが動いたときに起こるのかも知りたいからです。
neomana-39

2020/04/08 04:49

コメントありがとうございます。 ファイル名を大きくした理由は、試したこと、掲載したURLの記事を参考にしたためです。 しかし、あまりいみがなさそうだったので元どおりの小文字に戻しました。 既述して頂いたコマンドを実行した結果を、試したこと、の項に掲載しておきました。 よろしくおねがいします。
Lulucom

2020/04/08 06:13

> heroku open > を打つと次のようなエラー と書かれていましたね失礼しました。つまりトップページ`/`へアクセスされた場合だと思いますが、その場合は`ProfileController@index`が動くのでしょうか?関連するルーティングも掲載されると良いかと思います。 あと、`index2.blade.php`を修正後も全く同じエラー内容なのでしょうか。実はよく見たら変わっていたということはありませんか?
neomana-39

2020/04/08 06:20

返信ありがとうございます。 トップページはまた別のStoriesController@indexが動くように設定しております。 そちらのソースコードも掲載致しました。 自分も最初同じことを疑い、エラーページをよくみたのですが、全く同じエラーが表示されています…。 度々すみません、よろしくお願いします。
Lulucom

2020/04/08 10:37

Heroku上のindex2.blade.phpは本当に掲載された内容になっていますか?以下の出力結果と掲載された内容に違いはないでしょうか。 heroku run 'cat resources/views/stories/index2.blade.php'
neomana-39

2020/04/08 17:35

確認したところ、質問文のコードと違っていました…。 `git push heroku master` このコマンドを実行したところ、問題が解決しました! ありがとうございました。
guest

回答1

0

ベストアンサー

突っ込みどころは山ほどあるのですがとりあえず該当のエラーの解消方法だけ

<div class="aboutme"> <tbody> @foreach($posts as $profile) <tr> <td>{{ \Str::limit($profile->title, 100) }}</td> <td>{{ \Str::limit($profile->body, 250) }}</td> </tr> <a href="{{ action('ProfileController@delete', ['id' => $profile->id]) }}">delete</a> @endforeach </tbody> <br> <a href="{{ action('ProfileController@update', ['id' => $profile->id]) }}" class="update">update</a> </div>

こちらですが、foreachの外でprofile
を使用しています。foreachの仕様でforeachを抜けた後も最後の$profileだけは変数として残り続けます。
そのため、postsがforeachで回る場合は$profileがありますが、回らない場合は$profileがないため
variable: profileと言われています。
よってこの部分をforeach内に移動すると良いでしょう

投稿2020/04/07 07:15

mikkame

総合スコア5036

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

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

neomana-39

2020/04/07 16:14 編集

ご回答ありがとうございます。 指摘していただいた箇所を修正し、次のように変更しましたが変わらず同じエラーが表示されてしまいました。修正したものを質問文のソースコードとして掲載しました。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問