Ruby on rails ActiveRecord::RecordNotFound在Lynda Rails培训中出错(第9章-删除/销毁)

Ruby on rails ActiveRecord::RecordNotFound在Lynda Rails培训中出错(第9章-删除/销毁),ruby-on-rails,Ruby On Rails,我是新手,请原谅我的无知。我在Rails 3.2.3上,正在学习Lynda Ruby on Rails Essentials课程。我已经完成了标题中列出的章节,但是在确认删除按钮后,我得到了一个错误页面。下面是一段视频,向您展示这个过程 我已经审阅了以下文档,以确认我没有打字错误 这是我的list.html.erb <div class="subject list"> <h2>Subjects</h2> <%= link_to("Add New Sub

我是新手,请原谅我的无知。我在Rails 3.2.3上,正在学习Lynda Ruby on Rails Essentials课程。我已经完成了标题中列出的章节,但是在确认删除按钮后,我得到了一个错误页面。下面是一段视频,向您展示这个过程

我已经审阅了以下文档,以确认我没有打字错误

这是我的list.html.erb

<div class="subject list">
<h2>Subjects</h2>

<%= link_to("Add New Subject", {:action => 'new'}, :class => 'action new') %>

<table class="listing" summary="Subject List">
    <tr class="header">
        <th>&nbsp;</th>
        <th>Subject</th>
        <th>Visible</th>
        <th>Pages</th>
        <th>Actions</th>
    </tr>
    <% @subjects.each do |subject| %>
    <tr>
        <td><%= subject.position %></td>
        <td><%= subject.name %></td>
        <td class="center"><%= subject.visible ? 'Yes' : 'No' %></td>
        <td class="center"><%= subject.pages.size %></td>
        <td class="actions">
            <%= link_to("Show", {:action => 'show', :id => subject.id}, :class => 'action show') %>
            <%= link_to("Edit", {:action => 'edit', :id => subject.id}, :class => 'action edit') %>
            <%= link_to("Delete", {:action => 'delete', :id => subject.id}, :class => 'action delete') %>
        </td>
    </tr>
    <% end %>
</table>
这是我的delete.html.erb

<%= link_to("<< Back to List", {:action => 'list'}, :class => 'back-link') %>

<div class="subject delete">
    <h2>Delete Subject</h2>

<%= form_for(:subject, :url => {:action => 'destroy'}, :id => @subject.id) do |f| %>

    <p>Are you sure you want to permanently delete this subject?</p>

    <p class="reference-name">Subject name: <%= @subject.name %></p>

    <div class ="form-buttons">
        <%= submit_tag("Delete Subject") %>
        </div>

    <% end %>


</div>
这是我的主题_controller.rb

class SubjectsController < ApplicationController

    def index
    list
    render('list')
end


def list
    @subjects = Subject.order("subjects.position ASC")
  end

  def show
    @subject = Subject.find(params[:id])
  end

  def new
    @subject = Subject.new
  end

  def create
    # Instantiate a new object using form parameters
    @subject = Subject.new(params[:subject])
    # Save the object
    if @subject.save
      # If save succeeds, redirect to the list action
      redirect_to(:action => 'list')
    else
      # If save fails, redisplay the form so user can fix problems
      render('new')
    end
  end

  def edit
     @subject = Subject.find(params[:id])
  end

  def update
     # Find object using form parameters
      @subject = Subject.find(params[:id])
      # Update the object
      if @subject.update_attributes(params[:subject])
        # If save succeeds, redirect to the list action
        redirect_to(:action => 'show', :id => @subject.id)
      else
        # If save fails, redisplay the form so user can fix problems
        render('edit')
      end
  end

  def delete
    @subject = Subject.find(params[:id])
  end

  def destroy
     Subject.find(params[:id]).destroy
     redirect_to(:action => 'list')
  end
end
这是上面视频中提到的


如果我能得到一些帮助来理解为什么我不能正确地删除这个文件,那就太好了

很抱歉,我从未听说过Lynda Ruby on Rails Essentials课程,但我可以从您发布的代码中看到,您的删除表单看起来完全混乱,您有一个表单,但您使用的是提交标签!那没有道理。问题是,如果查看日志文件,您将看到传递到删除操作的参数不包含id,因此当您使用@subject=subject.findparams[:id]时,您将看到错误

解决方案-将submit_标记更改为f.submit,或将的form_更改为form_标记,并确保调用了正确的路由,这样id就应该通过params散列传回

您的日志文件堆栈跟踪始终是您最好的朋友,尽快了解它,您将发现您的生活更加轻松

更新

出于很多原因,我认为你最好的选择是把你的表格改成这样

<%= link_to("<< Back to List", {:action => 'list'}, :class => 'back-link') %>

<div class="subject delete">
    <h2>Delete Subject</h2>


    <p>Are you sure you want to permanently delete this subject?</p>

    <p class="reference-name">Subject name: <%= @subject.name %></p>

    <div class ="form-buttons">
        <%= button_to "Delete", subject_path(@subject), method: :delete %>
    </div>

</div>

第一种方法不起作用的原因是因为您错过了开头的标签James,我尝试了第1个选项,当delete.html页面加载时,按钮消失了,并替换为文本%=f.submitDelete Subject%>。在第二个选项中,我在Subjectsdelete中得到了一个结果错误页面NoMethodError。可能是没有呼叫正确的路线,但我不确定这意味着什么。Lynda.com是一个在线培训课程,但它使用了旧版本的Rails,我认为这可能会导致一些问题。我已确保将代码完全按原样输入。@BrettPayne我已更新了答案。我建议您使用Rails获得一份AWDWR敏捷Web开发的副本。它是大多数Rails开发人员的圣经,并且非常清楚地解释了这一点。你至少应该得到pdf,它可以从