对于我的项目,我有以下相关代码
路线:
resources :lists do
resources :items
end
我现在在列表/显示页面上包含一个循环,我想在其中显示该项目并为用户提供删除该项目的可能性。
所以我得到了这样的代码:
<% @items.each do |item|%>
<p>
Item: <%= item.name %>
<%= time_ago_in_words(item.created_at) %> ago.
</p>
<%= link_to "Delete", [@list.item, item], method: :delete %>
<% end %>
但是当我尝试运行它时,我收到错误:
undefined method 'item' for #<List:0x007fba7be6fe28>
虽然我在控制器中定义了变量:
产品控制器:
def destroy
@list = current_user.list
@item = @list.items
end
有人可以解释导致此错误的原因吗?
答案 0 :(得分:3)
你的控制器中有一个拼写错误 - 它应该是@items = @list.items
,这就是迭代无法正常工作的原因。
编辑:格式化原始问题后,我发现错误是在@list
对象上引发的,因此您必须修复delete
操作的路径:
<%= link_to "Delete", [@list, item], method: :delete %>
通过提供父对象(@list
)然后对象本身(item
)来构建路径 - Rails会将其转换为list_item_path
。
答案 1 :(得分:-1)
您正在使用@items.each
,并且您的控制器中只有@item
。
答案 2 :(得分:-1)
更改您的link_to
= link_to("Delete", lists_items_url(@list, @item), method: :delete)
您已定义资源:列表和资源:项目。 基本上你要做的是向集合发送一个DELETE请求,并带有要获取和删除项目的ID。
运行 佣金路线 来检查确切的命名,但我认为它是这样写的。虽然您似乎根据控制器的操作不需要ID,但您仍然需要为帮助者提供这些ID。