Rails 使用嵌套资源找不到销毁操作
Rails destroy action could not be found using nested resource
我与菜单和项目之间存在一对多关系。我有一个嵌套的资源设置,其中包含用于将项目添加到该特定菜单的添加和创建操作。带有该菜单中所有项目的列表。一切正常,但我在销毁操作时遇到问题。
我收到错误:
The action 'destroy' could not be found for ItemsController
从下面的代码可以看出,销毁操作在 ItemsController 中,并且不在 private 下,所以我不知道为什么找不到它。
items_controller.rb
class ItemsController < ApplicationController
before_action :find_menu
def create
@item = @menu.items.create!(item_params)
if @item.save
redirect_to @menu, notice: "Item added!"
else
redirect_to @menu, warning: "Item failed!"
end
end
def destroy
@item = @menu.items.find(params[:id])
@item.destroy
redirect_to @menu, notice: "Item deleted!"
end
private
def find_menu
@menu = Menu.find(params[:menu_id])
end
def item_params
params.require(:item).permit(:name, :price, :course, :vegetarian, :allergy, :menu_id)
end
end
..views/menus/show.erb.html
<tbody>
<% @items.each do |item| %>
<tr>
<td><%= item.name %></td>
<td><%= number_to_currency(item.price, unit: "£") %></td>
<td><%= item.course %></td>
<td><%= item.vegetarian %></td>
<td><%= item.allergy %></td>
<td><%= link_to "Delete", [@menu, item], method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-danger" %></td>
</tr>
<% end %>
</tbody>
menus_controller.rb
def show
@menu = Menu.find(params[:id])
@items = @menu.items
end
这一行:
<td><%= link_to "Delete", [@menu, item], method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-danger" %></td>
应该看起来像:
<td><%= link_to "Delete", menu_item_path(@menu, item), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-danger" %></td>
我与菜单和项目之间存在一对多关系。我有一个嵌套的资源设置,其中包含用于将项目添加到该特定菜单的添加和创建操作。带有该菜单中所有项目的列表。一切正常,但我在销毁操作时遇到问题。
我收到错误:
The action 'destroy' could not be found for ItemsController
从下面的代码可以看出,销毁操作在 ItemsController 中,并且不在 private 下,所以我不知道为什么找不到它。
items_controller.rb
class ItemsController < ApplicationController
before_action :find_menu
def create
@item = @menu.items.create!(item_params)
if @item.save
redirect_to @menu, notice: "Item added!"
else
redirect_to @menu, warning: "Item failed!"
end
end
def destroy
@item = @menu.items.find(params[:id])
@item.destroy
redirect_to @menu, notice: "Item deleted!"
end
private
def find_menu
@menu = Menu.find(params[:menu_id])
end
def item_params
params.require(:item).permit(:name, :price, :course, :vegetarian, :allergy, :menu_id)
end
end
..views/menus/show.erb.html
<tbody>
<% @items.each do |item| %>
<tr>
<td><%= item.name %></td>
<td><%= number_to_currency(item.price, unit: "£") %></td>
<td><%= item.course %></td>
<td><%= item.vegetarian %></td>
<td><%= item.allergy %></td>
<td><%= link_to "Delete", [@menu, item], method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-danger" %></td>
</tr>
<% end %>
</tbody>
menus_controller.rb
def show
@menu = Menu.find(params[:id])
@items = @menu.items
end
这一行:
<td><%= link_to "Delete", [@menu, item], method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-danger" %></td>
应该看起来像:
<td><%= link_to "Delete", menu_item_path(@menu, item), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-danger" %></td>