没有路由匹配[DELETE]“ /todo_lists/1/todo_items.9"

时间:2018-10-02 15:36:51

标签: ruby-on-rails

我一直在遵循使用Ruby on Rails创建Todo列表应用程序的教程。 Click to view Todo app tutorial here

到目前为止,我已经创建了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

这是我的路线。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 :(得分:2)

您的路线显示:

  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

(请注意“项目”与“项目”的变化)

您的链接代码应为:

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

要回答第二个问题:

您的路线显示:

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

此路由需要两个参数: TodoList 的ID和 TodoItem 的ID。这些在路由中显示为:todo_list_id :id

请注意,如何在控制器中首先通过before_action中的 params [:todo_list_id] 查找TodoList,然后通过 params [:id]在关联上查找TodoItem。

您必须在 link_to 中传递两个参数。

您可能应该阅读 Routing上的导轨指南,以更好地了解其工作原理:https://guides.rubyonrails.org/routing.html

答案 1 :(得分:0)

您的项目中存在更多错误。这是您的项目已修正,并已推送到我的git repo: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?" } %>

答案 2 :(得分:-1)

尝试一下:

<%= 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?" } %>