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

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

ただいまの
回答率

90.51%

  • PHP

    24035questions

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

  • Laravel 5

    2533questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

【Laravel5.5】編集確認画面からデータが更新できない

解決済

回答 4

投稿

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

前提・実現したいこと

Laravel5.5にて、下記画面のような一覧画面からの確認画面付き編集機能を作成したいと考えております。
編集確認画面から一覧への更新機能実装中に以下のエラーメッセージが発生しました。
どなたかエラー原因について、ご存知の方がいらっしゃいましたら教えて頂ければと思います。
宜しくお願い致します。
イメージ説明
※躓いている箇所は上記図の3から4の部分です。

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

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message


イメージ説明

該当のソースコード

■ \xampp\htdocs\demo\resources\views\students
【list.blade.php】

@extends('layouts.layout')
@section('title', 'Tutrial for beginner')
@section('content')
 <div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
  <h1><small>受講生一覧</small></h1>
  <div class="col-sm-2">
     <a href="{{ url('students/new_index') }}" class="btn btn-warning"><i class="glyphicon glyphicon-plus"></i> 新規登録</a>
  </div>
  </div>
  <table class="table table-striped table-hover">
  <thead>
  <tr>
  <th>No</th>
  <th>name</th>
  <th>email</th>
  <th>tel</th>
  <th>opration</th>
  </tr>
  </thead>
  <tbody>
      @foreach($students as $student)
      <tr>
          <td>{{ $student->id }}</td>
          <td>{{ $student->username }}</td>
          <td>{{ $student->email }}</td>
          <td>{{ $student->tel}}</td>
          <td>
          <a href="{{ action('StudentController@show', $student->id) }}" class="btn btn-primary btn-sm">詳細</a>
          <a href="{{ action('StudentController@edit_index', $student->id) }}" class="btn btn-primary btn-sm">編集</a>
          <a href="" class="btn btn-danger btn-sm">削除</a>
       </td>
      </tr>
      @endforeach
  </tbody>
  </table>
  <!-- page control -->
  {{ $students->links() }}
@endsection


【edit_index.blade.php】

@extends( 'layouts.layout' )
@section( 'title', 'Tutrial for beginner' )
@section( 'content' )
    <h3>受講生編集画面|入力画面</h3>
    <p><span class="label label-danger">入力画面</span>-> 確認画面 ->完了画面</p>
    <form action="{{ action('StudentController@edit_confirm', $students->id)}}" method="POST" class="form-horizontal">
        {{ csrf_field() }}
        {{ method_field('patch') }}
        <div class="form-group @if($errors->has('name')) has-error @endif">
            <label for="name" class="col-md-3 control-label">お名前</label>
            <div class="col-sm-9">
                <input type="name" class="form-control" id="name" name="name" value="{{ $students->username }}"> @if($errors->has('name'))
                <span class="text-danger">{{ $errors->first('name') }}</span> @endif
            </div>
        </div>
        <div class="form-group @if($errors->has('mail')) has-error @endif">
            <label for="mail" class="col-md-3 control-label">メールアドレス</label>
            <div class="col-sm-9">
                <input type="mail" class="form-control" id="mail" name="mail" value="{{ $students->email  }}"> @if($errors->has('mail'))
                <span class="text-danger">{{ $errors->first('mail') }}</span> @endif
            </div>
        </div>
        <div class="form-group @if($errors->has('tel')) has-error @endif">
            <label for="tel" class="col-md-3 control-label">電話番号</label>
            <div class="col-md-9">
                <input type="tel" class="form-control" id="tel" name="tel" value="{{$students->tel }}"> @if($errors->has('tel'))
                <span class="text-danger">{{ $errors->first('tel') }}</span> @endif
            </div>
        </div>
        <div class="col-md-offset-3 text-center"><button class="btn btn-primary">確認</button>
        </div>
    </form>
@endsection


【edit_confim.php】

@extends('layouts.layout')
@section('title', 'Tutrial for beginner')
@section('content')
 <h3>受講生編集画面|確認画面</h3>
 <p>入力画面-><span class="label label-danger"> 確認画面</span> ->完了画面</p>
 <form action="{{url('students/list/')}}" method="post" class="form-horizontal">
  {{ csrf_field() }}
  <input type="hidden" name="name" value="{{$name}}">
  <input type="hidden" name="email" value="{{$mail}}">
  <input type="hidden" name="tel" value="{{$tel}}">
  <div class="row">
  <label class="col-sm-4 control-label">お名前</label>
  <div class="col-sm-8">{{$name}}</div>
  </div>
  <div class="row">
  <label class="col-sm-4 control-label">メールアドレス</label>
  <div class="col-sm-8">{{$mail}}</div>
  </div>
  <div class="row">
  <label class="col-sm-4 control-label">電話番号</label>
  <div class="col-sm-8">{{$tel}}</div>
  </div>
  <div class="row" style="margin-top: 30px;">
  <div class="col-sm-offset-4 col-sm-8">
  <input type="submit" name="button1" value="登録" class="btn btn-primary btn-wide" />
  </div>
  </div>
 </form>
@endsection


■\xampp\htdocs\demo\routes
【web.php】

//studentsList画面
Route::prefix('students')->group(function () {
 Route::get('list','StudentController@getIndex'); //一覧表示
 Route::get('/edit_index/{id}', 'StudentController@edit_index');  //編集
 Route::patch('/edit_confirm/{id}','StudentController@edit_confirm'); //確認
 Route::post('/list/{id}', 'StudentController@update'); //UPdate完了
});


■\xampp\htdocs\demo\app
【Students.php】

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Students extends Model
{
    protected $fillable =['id','username','mail', 'tel' ];
}


■\xampp\htdocs\demo\app\Http\Controllers
【StudentController.php】

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;   //DBオブジェクト
use Illuminate\Http\Request;
use App\Http\Requests\CheckStudentRequest;
use App\Students;                           //Studentsクラス
use Validator;

class StudentController extends Controller
{
    public function getIndex(Request $request)
    {
     $students = DB::table('students')->Orderby('id','asc')->simplePaginate(5);
     return view('students.list', ['students' => $students]);
    }

    public function edit_index($id)
    {
      $students = Students::findorFail($id);
      return view('students.edit_index')->with('students',$students);
    }

    public function edit_confirm(CheckStudentRequest $request)
    {
      // $requestから全てのオブジェクトを引き出し$dataへ格納
      $data =  $request->all();
      // $dataの変数をstudents/new_confrimページに返す。
      return view('students.edit_confirm')->with($data);
    }

    public function update(Request $request,$id)
    {
      //Studentオブジェクトからレコードを検索
      $students = Students::findOrFail($id);
      // 値の保存
      $students->fill($request->all())->save();

      return redirect()->route('students.list');
    }    
}

試したこと

  •  edit_confim.phpのform actionの書き換え(1)
<form action="{{url('students/list/{id}')}}" method="post" class="form-horizontal">


→id部分が暗号化され、ページが見つかりませんとのエラー画面が出て駄目でした。

  • edit_confim.phpのform actionの書き換え(2)  
<form action="{{ action('StudentController@update', $student->id))}" method="post" class="form-horizontal">


→ unvariable $studentsで値が見つからないというエラーが出ます。

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

■ 使用OS:Windows 10 PRO
■ XAMPP Version: 7.2.5
■ phpversion:7.1
■ Laravelversion:5.5

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

check解決した方法

+1

色々とご協力有難うございました。更新での確認画面が要らないかもというアドバイスを頂き全文書き直しを行いました。下記に自己解決方法記載致します。
1.web.phpにてRoute::resource('student', 'studentController');で最初に
studentフォルダ配下全てリソース化を実行。
web.php

//resouceでstudent配下を丸ごとリソース化
Route::resource('student', 'studentController');

2.コマンドを開き、プロジェクトフォルダ配下で下記コマンド実行

>cd PJfolde
>php artisan make:controller StudentController -- resouce


3.そのままroute確認コマンドを実行し、下記のような画面が出るのでNAMEとURIを確認

>php artisan route:list


イメージ説明
※全て作成済みのためルートが消えてるものが御座います。ご了承ください

4.studentsControllerの作成

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;   //DBオブジェクト
use App\Http\Requests\CheckStudentRequest;
use Illuminate\Support\Arr;
use App\Students;                           //Studentsクラス
use Validator;

class StudentController extends Controller
{   
/**
     * 一覧表示
     *
     * @param Request $request
     * @return Response
     */
    public function index(Request $request)
    {
     $students = DB::table('students')->Orderby('id','asc')->simplePaginate(5);
     return view('student.index', ['students' => $students]);
    }

 public function edit($id)
    {
      $students = Students::findorFail($id);
     //route一覧NAME:student.editなのでその通りに指定
      return view('student.edit')->with('students',$students);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
      //Studentオブジェクトからレコードを検索
      $students = Students::findOrFail($id);
      // 値の編集の受付
      $students->username = $request->name;
      $students->email = $request->mail;
      $students->tel = $request->tel;

      // 編集した値の保存
       $students ->save();
      //定義されたrouteへ戻る。
       return redirect('student');
    }

}


5.web.phpの再編集

Route::resource('student', 'studentController');
Route::get('student/', 'studentController@index');
Route::get('student/{student}/edit','studentController@edit');
Route::patch('student/{student}','studentController@update');


6.student/index.blade.phpの編集
Link先を直接actionで指定して飛ばす{{action('studentController@edit', $student->id)}}

@extends('layouts.layout')
@section('title', 'Tutrial for beginner')
@section('content')
 <div class="page-header" style="margin-top:-30px;padding-bottom:0px;">
  <h1><small>受講生一覧</small></h1>
  <div class="col-sm-2">
     <a href="{{ action('studentController@create') }}" class="btn btn-warning"><i class="glyphicon glyphicon-plus"></i> 新規登録</a>
  </div>
  </div>
  <table class="table table-striped table-hover">
  <thead>
  <tr>
  <th>No</th>
  <th>name</th>
  <th>email</th>
  <th>tel</th>
  <th>opration</th>
  </tr>
  </thead>
  <tbody>
      @foreach($students as $student)
      <tr>
          <td>{{ $student->id }}</td>
          <td>{{ $student->username }}</td>
          <td>{{ $student->email }}</td>
          <td>{{ $student->tel}}</td>
          <td>
          <a href="" class="btn btn-primary btn-sm">詳細</a>
          <a href="{{action('studentController@edit', $student->id)}}" class="btn btn-primary btn-sm">編集</a>
          <a href="" class="btn btn-danger btn-sm">削除</a>
       </td>
      </tr>
      @endforeach
  </tbody>
  </table>
  <!-- page control -->
  {{ $students->links() }}
@endsection


7.student/edit.blade.phpの編集
updateメソッドで直接idを下記のように書いて、呼び出す。

@extends( 'layouts.layout' )
@section( 'title', 'Tutrial for beginner' )
@section( 'content' )
    <h3>受講生編集画面</h3>
    <form action="{{ action('studentController@update', ['id'=>$students->id]) }}" method="POST" class="form-horizontal">
        {{ csrf_field() }}
        {{ method_field('patch') }}
        <div class="form-group @if($errors->has('name')) has-error @endif">
            <label for="name" class="col-md-3 control-label">お名前</label>
            <div class="col-sm-9">
                <input type="name" class="form-control" id="name" name="name" value="{{ $students->username }}"> @if($errors->has('name'))
                <span class="text-danger">{{ $errors->first('name') }}</span> @endif
            </div>
        </div>
        <div class="form-group @if($errors->has('mail')) has-error @endif">
            <label for="mail" class="col-md-3 control-label">メールアドレス</label>
            <div class="col-sm-9">
                <input type="mail" class="form-control" id="mail" name="mail" value="{{  $students->email }}"> @if($errors->has('mail'))
                <span class="text-danger">{{ $errors->first('mail') }}</span> @endif
            </div>
        </div>
        <div class="form-group @if($errors->has('tel')) has-error @endif">
            <label for="tel" class="col-md-3 control-label">電話番号</label>
            <div class="col-md-9">
                <input type="tel" class="form-control" id="tel" name="tel" value="{{$students->tel }}"> @if($errors->has('tel'))
                <span class="text-danger">{{ $errors->first('tel') }}</span> @endif
            </div>
        </div>
        <div class="row" style="margin-top: 30px;">
           <div class="col-sm-offset-4 col-sm-8">
              <a  class="btn btn-default" href="{{action('studentController@index')}}">戻る</a>
              <button class="btn btn-success">更新</button>
           </div>
        </div>
    </form>
@endsection


6.以下画面遷移が完成する
イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

確認画面のView edit_confim.php において、formのPOST先が
action="{{url('students/list/')}}"
となっていますが、ここにIDが含まれていないため、
Route::post('/list/{id}', 'StudentController@update');
にマッチしていない、という状況ではないでしょうか。

ルートは存在する(Route::get('list')はあるので)が、メソッドが見つからない状態になっていそうです。

追記:
失礼しました。上記はわかっていて、IDがconfirmでうまく指定できない、という状態の様ですね・・。
何かわかりそうであれば再度追記したいと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

普通に文字列連結すればいけそうですがどうでしょう。

<form action="{{url('students/list/') . $id}}" method="post" class="form-horizontal">

$id 変数がビューへ渡されている前提なので、もし渡せてなかったらそこも直す必要があります。

'students/list/{id}' とりあえずこれは駄目です。
都合よく変数として解釈されるということはなく {id} という文字列としか認識されません。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/19 00:34

    ご回答ありがとうございます。
    実際にやってみたのですが、どうもうまくいきません。function updateのreturn文をreturn redirect()->route('students/list/'.$students->id);に置き換えた上で実行しましたが上手くいかなかったみたいです。
    もう少し自分で手がないかを考えてみようと思います。良い案があれば教えて頂ければと思います。
    宜しくお願い致します。

    キャンセル

  • 2019/05/19 07:20

    うまくいかなかった場合はどううまくいかないかを具体的に記載して頂くと引き続き回答可能です。
    最新のソースと、エラーが出た場合はエラーの内容を追記してみて下さい。

    キャンセル

  • 2019/05/20 17:17

    function updateのreturn文をreturn redirect()->route('students/list/'.$students->id);にし、<form action="{{url('students/list/') . $id}}" method="post" class="form-horizontal">と記載をしたのですが、route not /students/list/4 defineと表示をされページが表示されませんでした。調べた結果「routeの定義が必要」のことで、再度、web.phpのコントローラ配下を全てresouce('/student','StudentController')で紐づけを行いphp artisan make:controller StudentController -- resouceで実行したあとweb.phpに記載をし解決致しました。下記に自己解決方法記載致します。
    宜しくお願い致します

    キャンセル

0

StudentController@edit_confirmで$dataにidも含まれてるか確認。

ルーティングからはこう書いて$idも追加が必要なのでは。

use Illuminate\Support\Arr;

public function edit_confirm(CheckStudentRequest $request, $id)
{
    $data = $request->all();
    $data = Arr::add($data, 'id', $id);

    return ...
}

viewに渡せていれば$idで使うだけなので簡単。

そもそも確認画面が必要か考えたほうがいいけど。

  • 入力に間違いがあるならバリデーションで前の画面に戻る
  • 間違ったデータ登録されてもすぐに再度編集すれば済む
  • 購入のような重要なフォームでもなければ確認画面挟むメリットはなにもない。

https://website-usability.info/2016/10/entry_161010.html

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/20 17:19

    確かに、更新処理でしたら確認画面が不要ということが上記記事から理解することができます。頂いたアドバイスをもとに全文書き換えを行いました。
    色々アドバイスを頂き有難うございました。

    キャンセル

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

  • PHP

    24035questions

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

  • Laravel 5

    2533questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。