LoginSignup
kazunarigit
@kazunarigit (村田 一成)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ページが表示されない問題(404エラー、空ページ)

解決したいこと

https://github.com/kazunarigit/noveltool でadmin/create,admin/edit
などのページにアクセスすると、空ページになってしまいます。ルーティングやビューは問題ないと思います。が、何が原因か分かりません。
教えてください。

自分で試したこと

ルーティングやビューのコードを確認。ページにアクセスして、admin/createにアクセスして、コードを表示させると何もなかった。

0

4Answer

create関数は、新規作成ページを表示する関数なので、
新規登録ロジックはstore関数で処理してください。

まず下記create関数ですが、新規作成ページを表示するロジックなので、
新規登録ロジックは要らないです。

    public function create(Request $request, NovelWriting $novelWriting)
    {
        // 以下を追記
        // Varidationを行う
        $this->validate($request, NovelWriting::$rules);

        $novelwriting = new NovelWriting;
        $form = $request->all();
      
        // フォームから送信されてきた_tokenを削除する
        unset($form['_token']);
      
        $novelwriting->fill($form);
        $novelwriting->save();
      
        // admin/createにリダイレクトする
        return redirect('admin/create');
    }
    public function create(Request $request)
    {
        return view('admin.create');
    }

また、store関数ですが、returnがリダイレクト処理になってません。

    public function store(Request $request, NovelWriting $novelWriting)
    {
            // 以下を追記
        // Varidationを行う
        $this->validate($request, NovelWriting::$rules);

        $novelwriting = new NovelWriting;
        $form = $request->all();
      
        // フォームから送信されてきた_tokenを削除する
        unset($form['_token']);
      
        $novelwriting->fill($form);
        $novelwriting->save();
        return view('admin.create');
    }
    public function store(Request $request, NovelWriting $novelWriting)
    {
            // 以下を追記
        // Varidationを行う
        $this->validate($request, NovelWriting::$rules);

        $novelwriting = new NovelWriting;
        $form = $request->all();
      
        // フォームから送信されてきた_tokenを削除する
        unset($form['_token']);
      
        $novelwriting->fill($form);
        $novelwriting->save();
        return redirect('admin/index');
    }
0Like

Comments

  1. @kazunarigit

    Questioner
    ありがとうございました。確認したところ、admin/createでタイムアウト、admin/indexで前と同じようなエラーになりました。
    エラーに関してはルーティングの問題らしいですが、教えてくださったRoute::resource以下をコメントアウトすると、404 not foundになります。
  2. 実際にローカル環境で試してないので失念してました。

    URLはルーティングがRoute::resourceで一括で変わったので
    NovelWritingControllerのURLは全てadmin/novel_writings/***になります。

    admin/createではなく、admin/novel_writings/createになります。

    またリダイレクト処理は、Route::resourceで名前付きルートが自動的に設定されているので
    redirect('admin/index');のようにURLで指定するのではなく
    redirect()->route('admin.novel_writings.index');のようにルート名で指定した方が良いです。

    詳しくは、ドキュメントをお読みください
    https://readouble.com/laravel/6.x/ja/routing.html

  3. @kazunarigit

    Questioner
    フォルダ(novel_writings)を作成して見たところ、タイムアウトになります。(途中文法エラーも出たので修正しました)コードで間違っているところがあれば、教えてください。
  4. @kazunarigit

    Questioner
    お忙しいと思いますが、回答をお願いいたします。
  5. @kazunarigit

    Questioner
    お忙しいと思いますが、回答をお願いいたします。こちらも解決したいので、よろしくお願いします。
  6. >フォルダ(novel_writings)を作成して見たところ、タイムアウトになります。

    どの画面でエラーログには何が出てますか?
  7. @kazunarigit

    Questioner
    admin/novel_writings/indexが404 not found、それ以外(admin/novel_writings/createなど)が504 gateway time-outです。

Admin\NovelWritingControllerのaddメソッドの中身がコメントアウトされているため
空ページになるのではないでしょうか

// ルーティング
// noveltool/routes/web.php
Route::get('/create', 'Admin\NovelWritingController@add');

// コントローラー
// noveltool/app/Http/Controllers/Admin/NovelWritingController.php
public function add() {
    // return view('admin.create');
}

https://readouble.com/laravel/6.x/ja/routing.html
https://readouble.com/laravel/6.x/ja/controllers.html

0Like

Comments

  1. @kazunarigit

    Questioner
    ありがとうございました。新規作成ページは表示されました。が、admin/createで送信ボタンを押すと、https://gyazo.com/f5e20ecbfb6acaf8a2ec3aa5db6ffc0b のエラーになります。→これは解決しましたが、admin/indexにアクセスすると、getではなくpostを使えと言うようなエラーが出てpostに修正しましたが、エラーが出ます。
    ルーティングのどこが間違っているのでしょうか?教えてください。

一覧のURL https://domain/admin/novel_writings
実際に動かして無いので不具合あるかもですが、
下記それぞれのファイルの修正コードになります。
修正部分が多いので、ファイルの中身をそのまま貼り付けてます。

routes/web.php

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
/*
Route::get('/', function () {
    return view('welcome');
});
*/

Route::group(['prefix' => 'admin', 'as'=> 'admin.', 'middleware' => 'auth'], function() {
    Route::resource('novel_writings', 'Admin\NovelWritingController');
});
Route::get('/index', 'NovelWritingController@index');
Auth::routes();
Route::get('/', 'NovelWritingController@index');

app/Http/Controllers/Admin/NovelWritingController.php

<?php

namespace App\Http\Controllers\Admin;

use App\NovelWriting;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;


class NovelWritingController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        $cond_title = $request->cond_title;
        if ($cond_title != '') {
        // 検索されたら検索結果を取得する
            $posts = NovelWriting::where('title', $cond_title)->get();
        }else{
        // それ以外はすべてのニュースを取得する
            $posts = NovelWriting::all();
        }
            return view('admin.novel_writings.index', ['posts' => $posts, 'cond_title' => $cond_title]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('admin.novel_writings.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
            // 以下を追記
        // Varidationを行う
        $this->validate($request, NovelWriting::$rules);

        $novelwriting = new NovelWriting;
        $form = $request->all();

        // フォームから送信されてきた_tokenを削除する
        unset($form['_token']);

        $novelwriting->fill($form);
        $novelwriting->save();
        return redirect()->route('admin.novel_writings.index');
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\NovelWriting  $novelWriting
     * @return \Illuminate\Http\Response
     */
    public function show(Request $request, NovelWriting $novelWriting)
    {
        $cond_title = $request->cond_title;
        if ($cond_title != '') {
        // 検索されたら検索結果を取得する
            $posts = NovelWriting::where('title', $cond_title)->get();
        }else{
        // それ以外はすべてのニュースを取得する
            $posts = NovelWriting::all();
        }
        return view('admin.novel_writings.index', ['admin' => User::findOrFail($id)]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\NovelWriting  $novelWriting
     * @return \Illuminate\Http\Response
     */
    public function edit(NovelWriting $novelWriting)
    {
        return view('admin.novel_writings.edit', ['novelwriting_form' => $novelWriting]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\NovelWriting  $novelWriting
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, NovelWriting $novelWriting)
    {
        // Validationをかける
        $this->validate($request, NovelWriting::$rules);
        // 送信されてきたフォームデータを格納する
        $novelWriting_form = $request->all();



        unset($novelWriting_form['remove']);
        unset($novelWriting_form['_token']);

        // 該当するデータを上書きして保存する
        $novelWriting->fill($novelWriting_form)->save();

        // $history = new History();
        // $history->news_id = $news->id;
        // $history->edited_at = Carbon::now();
        // $history->save();


      return redirect()->route('admin.novel_writings.index');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\NovelWriting  $novelWriting
     * @return \Illuminate\Http\Response
     */
    public function destroy(NovelWriting $novelWriting)
    {
        // 削除する
        $novelWriting->delete();
        return redirect()->route('admin.novel_writings.index');
    }
}

resources/views/admin/novel_writings/create.blade.php


@extends('layouts.admin')
@section('title', '小説の新規作成')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 mx-auto">
                <h2>新規小説作成</h2>
                <form action="{{ route('admin.novel_writings.store') }}" method="post" enctype="multipart/form-data">

                    @if (count($errors) > 0)
                        <ul>
                            @foreach($errors->all() as $e)
                                <li>{{ $e }}</li>
                            @endforeach
                        </ul>
                    @endif
                    <div class="form-group row">
                        <label class="col-md-2">タイトル</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="title" value="{{ old('title') }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2"></label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="chapter" value="{{ old('chapter') }}">
                        </div>
                    <div class="form-group row">
                        <label class="col-md-2"></label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="section" value="{{ old('section') }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2">本文</label>
                        <div class="col-md-10">
                            <textarea class="form-control" name="content" rows="20">{{ old('content') }}</textarea>
                        </div>
                    </div>
                    {{ csrf_field() }}
                    <input type="submit" class="btn btn-primary" value="保存">
                </form>
            </div>
        </div>
    </div>
@endsection

resources/views/admin/novel_writings/edit.blade.php

@extends('layouts.admin')
@section('title', '小説の編集')

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-md-8 mx-auto">
                <h2>小説編集</h2>
                <form action="{{ route('admin.novel_writings.update', $novelwriting_form->id) }}" method="post" enctype="multipart/form-data">
                    @if (count($errors) > 0)
                        <ul>
                            @foreach($errors->all() as $e)
                                <li>{{ $e }}</li>
                            @endforeach
                        </ul>
                    @endif
                    <div class="form-group row">
                        <label class="col-md-2" for="title">タイトル</label>
                        <div class="col-md-10">
                            <input type="text" class="form-control" name="title" value="{{ $novelwriting_form->title }}">
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-md-2" for="content">本文</label>
                        <div class="col-md-10">
                            <textarea class="form-control" name="content" rows="20">{{ $novelwriting_form->content }}</textarea>
                        </div>
                    </div>
                    <div class="form-group row">
                        <div class="col-md-10">
                            <input type="hidden" name="id" value="{{ $novelwriting_form->id }}">
                            {{ csrf_field() }}
                            <input type="submit" class="btn btn-primary" value="更新">
                        </div>
                    </div>
                </form>
                {{-- 以下を追記 
                <div class="row mt-5">
                    <div class="col-md-4 mx-auto">
                        <h2>編集履歴</h2>
                        <ul class="list-group">
                            @if ($novelwriting_form->histories != NULL)
                                @foreach ($novelwriting_form->histories as $history)
                                    <li class="list-group-item">{{ $history->edited_at }}</li>
                                @endforeach
                            @endif
                        </ul>
                    </div>
                </div>
                --}}
            </div>
        </div>
    </div>
@endsection


resources/views/admin/novel_writings/index.blade.php

@extends('layouts.admin')
@section('title', '小説一覧')

@section('content')
    <div class="container">
        <div class="row">
            <h2>作成済み小説の一覧</h2>
        </div>
        <div class="row">
            <div class="col-md-4">
                <a href="{{ route('admin.novel_writings.create') }}" role="button" class="btn btn-primary">新規作成</a>
            </div>
            <div class="col-md-8">
                <form action="{{ route('admin.novel_writings.index') }}" method="get">
                    <div class="form-group row">
                        <label class="col-md-2">タイトル</label>
                        <div class="col-md-8">
                            <input type="text" class="form-control" name="cond_title" value={{ $cond_title }}>
                        </div>
                        <div class="col-md-2">
                            {{ csrf_field() }}
                            <input type="submit" class="btn btn-primary" value="検索">
                        </div>
                    </div>
                </form>
            </div>
        </div>
        <div class="row">
            <div class="admin-index col-md-12 mx-auto">
                <div class="row">
                    <table class="table table-dark">
                        <thead>
                            <tr>
                                <!--<th width="10%">ID</th>-->
                                <th width="20%">タイトル</th>
                                <!--<th width="50%">本文</th>-->
                                <!--<th width="10%">操作</th>-->
                            </tr>
                        </thead>
                        <tbody>
                             @foreach($posts as $novel)
                                <tr>
                                    <th>{{ $novel->id }}</th>
                                    <td>{{ \Str::limit($novel->title, 100) }}</td>
                                    <td>{{ \Str::limit($novel->body, 250) }}</td>
                                    <td>
                                        <div>
                                            <a href="{{ route('admin.novel_writings.edit', $novel->id) }}">編集</a>
                                        </div>
                                        <div>
                                            <a href="{{ route('admin.novel_writings.destroy', $novel->id) }}">削除</a>
                                        </div>
                                    </td>
                                </tr>
                            @endforeach
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
@endsection

0Like

Comments

  1. @kazunarigit

    Questioner
    ありがとうございます。修正しました。しかし、現象は変わらないようです。admin/novel_writings/indexがnot found,createなどが504 gateway time-outです。
    (質問)index.blade.phpの点線の意味は何でしょうか?
  2. >(質問)index.blade.phpの点線の意味は何でしょうか?
    点線とはどれのことを指してますか?


    routes/web.phpの
    'as'=> 'admin'ですが、
    'as'=> 'admin.'です。ピリオドが必要です。


    php artisan route:listでルート設定はどうなってますか?
  3. 点線の件は構文上おかしな箇所を示しています。
    {{ $cond_title }}がダブルクォートで囲われてないからですね

    > php artisan route:://は問題ありませんでした。
    出力された内容が知りたいので貼っていただけますか?
  4. @kazunarigit

    Questioner
    ダブルクォートは修正します。出力内容はスクショのURLを貼りましたが……
  5. ありがとうございます
    キャプチャー確認しました。正しくルーティングが設定されてますので404になることはないはずですが、
    /admin/novel_writings にアクセスすると404エラーになるんですよね? 

    storage/logs/ にエラーログが保存されてたりしませんか?
  6. @kazunarigit

    Questioner
    logsの中はgitignoreしかなかったですね。
  7. Webサーバー側のエラーログはどうですか?
  8. @kazunarigit

    Questioner
    すみません。場所が分からないです。フォルダやファイル名が分かれば、調べられるんですが。
  9. 使ってる環境で変わりますので検索して調べてみてください
  10. @kazunarigit

    Questioner
    すみません。githubで見てました。cloud9上では、laravel.logというファイルがありましたので、明日内容を貼ります。
  11. @kazunarigit

    Questioner
    上のログファイルですが、最近の部分だけ貼ります。全体はかなりあります。
    [2022-11-16 12:14:58] local.ERROR: Maximum execution time of 60 seconds exceeded {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Maximum execution time of 60 seconds exceeded at /home/ec2-user/environment/noveltool/vendor/symfony/polyfill-mbstring/Mbstring.php:635)
    [stacktrace]
    #0 {main}
    "}
    [2022-11-16 12:16:52] local.ERROR: Maximum execution time of 60 seconds exceeded {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Maximum execution time of 60 seconds exceeded at /home/ec2-user/environment/noveltool/vendor/symfony/polyfill-mbstring/Mbstring.php:635)
    [stacktrace]
    #0 {main}
    "}
    [2022-11-22 09:50:00] local.ERROR: Maximum execution time of 60 seconds exceeded {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Maximum execution time of 60 seconds exceeded at /home/ec2-user/environment/noveltool/vendor/symfony/polyfill-mbstring/Mbstring.php:635)
    [stacktrace]
    #0 {main}
    "}
    [2022-11-22 09:57:38] local.ERROR: Maximum execution time of 60 seconds exceeded {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Maximum execution time of 60 seconds exceeded at /home/ec2-user/environment/noveltool/vendor/symfony/polyfill-mbstring/Mbstring.php:635)
    [stacktrace]
    #0 {main}
    "}
    [2022-11-22 11:58:43] local.ERROR: Maximum execution time of 60 seconds exceeded {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 1): Maximum execution time of 60 seconds exceeded at /home/ec2-user/environment/noveltool/vendor/symfony/polyfill-mbstring/Mbstring.php:635)
    [stacktrace]
    #0 {main}
    "}
  12. @kazunarigit

    Questioner
    インスタンスを再起動したところ、create以外は404エラーになりました。
  13. エラーメッセージは何が出てますか?
    まずエラーログからエラーメッセージを調べてください

    大体エラーメッセージをググれば載ってます
  14. @kazunarigit

    Questioner
    404 not foundはエラーログに記録されませんね。
  15. コントローラーのindexメソッドにdd(1);とか書いてそこまで到達してるか確認してください
  16. @kazunarigit

    Questioner
    変わりませんね。404エラーのままです。indexのすぐ下に書いたのですが。
  17. 自分で動かしてるわけではないので
    エラーメッセージないならもうわかんないですね
    お手上げです

キャプチャを見ると、admin/newのときのエラーのように見受けられますが、admin/indexのエラーですか?

admin/indexは小説の一覧取得なのでgetじゃないといけません。

ルーティングの設定ですが、ちょっと直感的じゃないので
下記ドキュメントのリソースコントローラー部分を読んで修正してみてください。
https://readouble.com/laravel/6.x/ja/controllers.html
すると下記のような感じで修正ができます。
※ controller、viewも修正する必要があります。

// routes/web.php ルーティング設定
Route::group(['prefix' => 'admin', 'as' => 'admin.', 'middleware' => 'auth'], function() {
    Route::resource('novel_writings', 'Admin\NovelWritingController');
});
// view側のURLの生成部分
route('admin.novel_writings.index'); 
route('admin.novel_writings.create');
route('admin.novel_writings.store');
route('admin.novel_writings.show', $novel->id);
route('admin.novel_writings.edit', $novel->id);
route('admin.novel_writings.update', $novel->id);
route('admin.novel_writings.destroy', $novel->id);
ルーティング 内容 controllerメソッド
admin.novel_writings.index 一覧表示 index
admin.novel_writings.create 登録画面表示 create
admin.novel_writings.store 登録処理 store
admin.novel_writings.show 個別表示 show
admin.novel_writings.edit 更新画面表示 edit
admin.novel_writings.update 更新画面表示 update
admin.novel_writings.destroy 削除処理 destroy
0Like

Comments

  1. app/Http/Admin/NovelWritingController ですが、
    create関数は、新規作成ページを表示する関数なので、
    新規登録ロジックはstore関数で処理してください。

    resources/views/admin/create.blade.php
    のformのactionは「route('admin.novel_writings.store')」になるはずです。



  2. @kazunarigit

    Questioner
    Controllerのロジックですが、return viewのところを変えれば良いですか?
    create.blade.phpとControllerをわかる範囲で修正しました。間違ってたら教えてください。
  3. @kazunarigit

    Questioner
    回答がないのですが、間違っているところがあれば、教えてください。

Your answer might help someone💌