Laravel отсутствуют необходимые параметры на маршруте уничтожения - PullRequest
0 голосов
/ 27 марта 2020

Я только что создал новый проект, похожий на список задач в Laravel. Когда я пытаюсь сделать простое удаление, я получаю эту ошибку:

Отсутствуют обязательные параметры для [Route: destroy] [URI: {}]. (Представление: C: ... \ resources \ views \ index.blade. php)

Вот часть кода из index.blade. php:

@if($todos)
    <ol>
       @foreach($todos as $todo)
           <li>{{ $todo->todo }}</li>
            <form action="" method="post">
                @csrf
                @method('Delete')
                <a href="{{ route('destroy', ['id' => $todo->id]) }}" class="btn btn-danger">x</a>
            </form>
       @endforeach
    </ol>
@endif

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

Часть кода из controller :

public function index()
    {
        $todos = Todo::all();
        return view('index', ['todos' => $todos]);
    }


public function destroy($id)
{
    Todo::findOrFail($id)->delete();
}

и строка кода из web. php:

Route::resource('/', 'TodosController');

Это так просто c, и это сводит меня с ума, потому что я могу не понять, что является причиной этой ошибки. Кажется, все хорошо.

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

Я не уверен на 100%, но попробуйте обновить объявление маршрута вашего ресурса до:

Route::resource('todos', 'TodosController');

и изменить ссылку на

<a href="{{ route('todos.destroy', ['todo' => $todo->id]) }}" class="btn btn-danger">x</a>

В документации здесь https://laravel.com/docs/5.7/controllers#restful -naming-resource-route-parameters

Они описывают маршруты как созданные как:

Действия, обработанные контроллером ресурсов

УДАЛИТЬ / photos / {фото} уничтожить photos.destroy

0 голосов
/ 27 марта 2020

Quirel, Ваш ответ решил эту ошибку, но теперь он не удаляет мои "сообщения". Он просто показывает мне страницу "Не найдено - 404". Я пробовал повозиться, и эта строка кода должна работать.

https://prnt.sc/rnqw1k

код:

public function destroy($id)
    {
        $todo = Todo::findOrFail($id);
        $todo->delete();

        return redirect('/');
    }

Также вы можете объяснить мне почему в качестве второго параметра мы просто отправляем $ todo-> id, а не ['id' => $ todo-> id]?

0 голосов
/ 27 марта 2020

Вы на самом деле не отправляете свою форму. Вы просто нажимаете на ссылку, поэтому вы по сути делаете GET-запрос, а не POST-запрос.

Вам необходимо отправить его через форму.

@foreach($todos as $todo)
    <li>{{ $todo->todo }}</li>

    <form action="{{ route('destroy', $todo->id) }}" method="POST">
        @csrf
        @method('DELETE')
        <input type="submit" class="btn btn-danger" value="x" />
    </form>
@endforeach

Наличие такой встроенной формы может показаться немного странным, поэтому вместо этого вы можете поместить кнопку снаружи и отправить свою форму при нажатии.

@foreach($todos as $todo)
    <li>
        {{ $todo->todo }}
        <a href="#" class="btn btn-danger" 
           onclick="event.preventDefault();
                    document.getElementById('todo-destroy-{{ $todo->id }}').submit();">x</a>
    </li>

    <form action="{{ route('destroy', $todo->id) }}" method="POST" id="todo-destroy-{{ $todo->id }}">
        @csrf
        @method('DELETE')
    </form>
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...