为什么我得到未定义的方法`destroy'为零:NilClass?

时间:2016-02-04 02:40:16

标签: ruby-on-rails ruby

我想删除用户发布的内容。但是,尽管我正在镜像我在其他应用程序中使用过的设置,但它的工作方式与普通方式不同。

我的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

2 个答案:

答案 0 :(得分:4)

看起来你没有加载@color,实例变量会自动初始化为nil(与局部变量形成对比,如果你在不指定的情况下使用它们会引发异常) 。因此,Ruby抱怨destroynil未定义。首先加载@color

@color = Color.find(params[:id])

如果您在控制器中的其他位置使用Color.find_by_id(例如,before_action),则ID可能与现有颜色不对应。与find不同,find_by_id会在记录丢失时返回nil

答案 1 :(得分:2)

2个问题:

subroutine

上述内容对您有用。