我想删除用户发布的内容。但是,尽管我正在镜像我在其他应用程序中使用过的设置,但它的工作方式与普通方式不同。
我的HTML:
<div class="section-wrap">
<% @colors.each do |color| %>
<div class="swatch">
<div class="colorblock" style="background-color: <%= color.backgroundcolor %>">
</div>
<h2>PANTONE<sup>2</sup></h2>
<p><%= color.name %></p>
</div>
<div class="controls">
<% if current_user %>
<%= link_to 'Delete', @color, method: :delete %>
<% end %>
</div>
<% end %>
</div>
我的控制器操作:
def destroy
@color.destroy
redirect_to root_path
end
我的routes.rb(我不应该指定删除路由):
resources :colors
delete 'colors', to: 'colors#destroy'
然后rake routes
给出了我期望的路线:
DELETE /colors/:id(.:format) colors#destroy
但我得到undefined method 'destroy' for nil:NilClass
答案 0 :(得分:4)
看起来你没有加载@color
,实例变量会自动初始化为nil
(与局部变量形成对比,如果你在不指定的情况下使用它们会引发异常) 。因此,Ruby抱怨destroy
上nil
未定义。首先加载@color
:
@color = Color.find(params[:id])
如果您在控制器中的其他位置使用Color.find_by_id
(例如,before_action
),则ID可能与现有颜色不对应。与find
不同,find_by_id
会在记录丢失时返回nil
。
答案 1 :(得分:2)
2个问题:
subroutine
上述内容对您有用。