delete语句的未定义方法错误

时间:2015-01-27 12:39:46

标签: ruby-on-rails ruby

对于我的项目,我有以下相关代码

路线:

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

有人可以解释导致此错误的原因吗?

3 个答案:

答案 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。