Как обновить базу данных с помощью контроллера Laravel? MethodNotAllowedHttpException Нет сообщения об ошибке сообщение - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь обновить свою базу данных, используя форму на моем Страница edit.blade.php, как показано ниже. Часть редактирования работает правильно, так как поля заполнены в форме, как и ожидалось, однако при попытке сохранить сообщение об ошибке

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException Нет сообщения

отображается. Я пробовал так много способов, как это исправить, и я не уверен, где я иду не так. Надеюсь, это что-то простое исправить?

edit.blade.php

@extends('layouts.app')

    <!-- Styles -->
        <link href="{{ asset('css/app.css') }}" rel="stylesheet">

    @section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">


            <form method="post" action="{{ action('PostsController@update', $id) }}">

                {{ csrf_field() }}
                <input type="hidden" name="_method" value="PATCH" />

            <h1>Edit Item</h1>
            <div class="form-group">

                <label for="item">Item:</label>

                <input type="text" id="item" name="item" value="{{$post->item}}" class="form-control" required>

            </div>



            <div class="form-group">

                        <label for="weight">Weight (g):</label>

                        <input type="number" id="weight" value="{{$post->weight}}" name="weight" class="form-control">

            </div>



            <div class="form-group">

                        <label for="noofservings">No of Servings:</label>

                        <input type="number" id="noofservings" value="{{$post->noofservings}}" name="noofservings" class="form-control">

            </div>



            <div class="form-group">

                        <label for="calories">Calories (kcal):</label>

                        <input type="number" id="calories" name="calories" value="{{$post->calories}}" class="form-control">

            </div>



            <div class="form-group">

                        <label for="fat">Fat (g):</label>

                        <input type="number" id="fat" name="fat" value="{{$post->fat}}" class="form-control">

            </div>



            <button type="submit" class="btn btn-primary">Save</button>


        </form>

            </div>
        </div>
    </div>
@endsection

PostsController.php

<?php
public function update(Request $request, $id)
    {

        $this->validate('$request', [

            'item' => 'required'

        ]);

         $post = Post::find($id);
         $post->item = $request->input('item');
         $post->weight = $request->input('weight');
         $post->noofservings = $request->input('noofservings'); 
         $post->calories = $request->input('calories');
         $post->fat = $request->input('fat');
         $post->save();

         return redirect('/foodlog');
    }

web.php

<?php
Route::get('edit/{id}', 'PostsController@edit');

Route::put('/edit', 'PostsController@update');

Post.php

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{

    protected $fillable = [

        'id',
        'user_id',
        'item',
        'weight',
        'noofservings', 
        'calories',
        'fat',
        'created_at'
    ]; 

}

Мой веб-сайт является приложением журнала продуктов, и эта функция позволяет редактировать его журнал.

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Основная проблема внутри ваших маршрутов:

Route::put('/edit/{id}', 'PostsController@update');

Вы также должны добавить id в параметры вашего маршрута. Ваша функция update() нуждается в двух параметрах: во-первых, в параметрах формы из формыляра, а во-вторых, в $id отредактированной записи журнала.

Второй находится внутри вашего HTML-шаблона:

<input type="hidden" name="_method" value="PUT" />

Чтобы выбрать правильный маршрут, вы должны добавить соответствующий метод к вашему маршруту Route::put('/edit/{id}', 'PostsController@update');.

Возможная последняя проблема

<form method="post" action="{{ action('PostsController@update', $post->id) }}">

Я не уверен, как работает ваш шаблон, но $id возможно не установлен внутри вашего шаблона Может быть, попытаться указать идентификатор в зависимости от вашего сообщения. Просто чтобы удостовериться, что идентификатор прибывает из показанного сообщения.

Дополнительные предложения

Рекомендуется использовать встроенный в Symfony FormBuilder . Это упростит таргетинг на такие особые запросы, как PUT, PATCH, OPTIONS, DELETE и т. Д.

0 голосов
/ 27 апреля 2018

Основываясь на Михаиле Чеховски, я отредактировал свой ответ, чтобы сделать этот ответ лучше. Основная проблема в ваших маршрутах:

Route::put('/edit/{id}', 'PostsController@update');

Вы также должны добавить идентификатор в параметры вашего маршрута. Ваша функция update () нуждается в двух параметрах: во-первых, в параметрах формы из формул, а во-вторых, в $ id отредактированной записи журнала.

Вторая проблема - поле метода формы 'patch', а ваш метод маршрута 'put'.

Разница между 'patch' и 'put' составляет:

put: получает данные, обновляет строку и создает новую строку в базе данных из данных, которые вы хотите обновить.

patch: просто обновляет строку и не создает новую строку.

поэтому, если вы хотите просто обновить старую строку, измените метод маршрута на patch.

или, если вы действительно хотите поместить данные, просто измените поле метода put в вашей форме.

просто: {{method_field('PUT')}}

Помните , методы формы и маршрута должны быть одинаковыми. Если указан метод формы, необходимо указать метод route; и наоборот.

...