0

私は新しいので、私の完全な無知を許してください。私は 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>

ここに私のsubject_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

上記のビデオで参照されている結果のエラー ページを次に示します。

ファイルを適切に削除できない理由を理解する助けが得られれば、それは素晴らしいことです。

4

1 に答える 1

0

申し訳ありませんが、「Lynda Ruby on Rails Essentials コース」については聞いたことがありませんが、投稿されたコードから、削除フォームが完全にめちゃくちゃに見えます。form_for がありますが、submit_tag を使用しています! それは意味がありません。問題は、ログ ファイルを見ると、delete アクションに渡されたパラメータに ID が含まれていないことがわかります。したがって、使用@subject = Subject.find(params[:id])すると、表示されているエラーが発生します。

解決策 - submit_tag を f.submit に変更するか、form_for を form_tag に変更し、正しいルートが呼び出されていることを確認します。これにより、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>

最初の方法が機能しなかった理由は、先頭の開始タグ「<」を見逃したため、ボタンの代わりにテキストが表示されたためです。

フォームは必要ありません。データを入力していないので、button_to を使用して、削除アクションに移動するように指示してください。

コードをテストしていませんが、問題ないはずです

于 2012-04-26T06:41:06.550 に答える