我一直在遵循使用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?" } %>
非常感谢您。
答案 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?" } %>