Не найдено ни одного маршрута [DELETE] "/todo_lists/1/todo_items.9" - PullRequest
0 голосов
/ 02 октября 2018

Я следовал руководству по созданию приложения списка Todo с использованием Ruby on Rails. Нажмите, чтобы просмотреть руководство по приложению Todo здесь

На данный момент я создал контроллер TodoLists, контроллер TodoItems и действия вместе с соответствующими моделями.

Вот мой код:

todo_items_controller.rb:

class TodoItemsController < ApplicationController
before_action :set_todo_list

  def create
    @todo_item = @todo_list.todo_items.new(todo_item_params)
    if @todo_item.save
      redirect_to todo_list_path(@todo_list)
    end
  end

  def destroy
    @todo_item = @todo_list.todo_items.find(params[:id])
    if @todo_item.destroy
      flash[:success] = "Todo List item was deleted."
    else
      flash[:danger] = "Todo List item could not be deleted."
    end
    redirect_to @todo_list
  end

  private
  def todo_item_params
    params.require(:todo_item).permit(:content)
  end

  def set_todo_list
    @todo_list = TodoList.find(params[:todo_list_id])
  end
end

Вот мой route.rb:

rails routes
                   Prefix Verb   URI Pattern                                                                              Controller#Action
                     root GET    /                                                                                        todo_lists#index
     todo_list_todo_items GET    /todo_lists/:todo_list_id/todo_items(.:format)                                           todo_items#index
                          POST   /todo_lists/:todo_list_id/todo_items(.:format)                                           todo_items#create
  new_todo_list_todo_item GET    /todo_lists/:todo_list_id/todo_items/new(.:format)                                       todo_items#new
 edit_todo_list_todo_item GET    /todo_lists/:todo_list_id/todo_items/:id/edit(.:format)                                  todo_items#edit
      todo_list_todo_item GET    /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#show
                          PATCH  /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#update
                          PUT    /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#update
                          DELETE /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#destroy
               todo_lists GET    /todo_lists(.:format)                                                                    todo_lists#index
                          POST   /todo_lists(.:format)                                                                    todo_lists#create
            new_todo_list GET    /todo_lists/new(.:format)                                                                todo_lists#new
           edit_todo_list GET    /todo_lists/:id/edit(.:format)                                                           todo_lists#edit
                todo_list GET    /todo_lists/:id(.:format)                                                                todo_lists#show
                          PATCH  /todo_lists/:id(.:format)                                                                todo_lists#update
                          PUT    /todo_lists/:id(.:format)                                                                todo_lists#update
                          DELETE /todo_lists/:id(.:format)                                                                todo_lists#destroy

Я думаю, что проблема здесь в следующем коде в _todo_item.html.erbс "todo_item.id".Кроме того, поскольку я обычно знаком с простыми link_to с такими, как <%= link_to "Delete", article_path(@article), method: :delete, data: { confirm: "Are you sure? } %>, я не уверен, как сконструированы более сложные link_to, особенно todo_list_todo_items_path(@todo_list, todo_item.id)

_todo_item.html.erb:

<p><%= todo_item.content %></p>
<%= link_to "Delete", todo_list_todo_items_path(@todo_list, todo_item.id), method: :delete, data: { confirm: "Are you sure?" } %>
  1. Может ли кто-нибудь указать на ошибку в моем коде?
  2. Объяснить вторую часть тега link_to, о которой я упоминал выше?

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Ваши маршруты показывают:

  todo_list_todo_item GET    /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#show
                      PATCH  /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#update
                      PUT    /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#update
                      DELETE /todo_lists/:todo_list_id/todo_items/:id(.:format)                                       todo_items#destroy

Итак, помощник для маршрута DELETE:

todo_list_todo_item_path

не

todo_list_todo_items_path

(обратите внимание на изменение в'item' vs 'items')

Ваш код ссылки должен быть:

<%= link_to "Delete", todo_list_todo_item_path(@todo_list, todo_item.id), method: :delete, data: { confirm: "Are you sure?" } %>

Чтобы ответить на второй вопрос:

Ваши маршрутыshow:

DELETE /todo_lists/:todo_list_id/todo_items/:id(.:format)

Для этого маршрута требуются два параметра: идентификатор TodoList и идентификатор TodoItem .На маршруте они отображаются как : todo_list_id и : id .

Обратите внимание, как в вашем контроллере вы впервые находите список TodoList с помощью params [: todo_list_id] в before_action, и затем вы находите TodoItem для ассоциации с помощью params [: id] в действии.

В вашем link_to ,вам нужно передать оба параметра.

Руководство по Rails по маршрутизации , вероятно, вам следует прочитать, чтобы лучше понять, как все это работает: https://guides.rubyonrails.org/routing.html

0 голосов
/ 02 октября 2018

У вас больше ошибок в ваших проектах.Вот ваш проект, исправленный в моем репозитории git: https://github.com/nezirz/todo-list

<%= link_to "DELETE - #{todo_item.content}", todo_list_todo_item_path(@todo_list, todo_item.id), method: :delete, data: { confirm: "Are you sure?" } %>
0 голосов
/ 02 октября 2018

Попробуйте это:

<%= link_to "Delete", todo_list_todo_items_path(todo_list_id: @todo_list.id, id: todo_item.id), method: :delete, data: { confirm: "Are you sure?" } %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...