10

私のアプリは、ユーザーがいくつかの統計を送信するたびに、テーブルの行を正常に作成します。ここで、いくつかの行を削除できるように削除ボタンを提供したいと考えています。

削除ボタンをクリックすると、次のエラーが表示されます。

undefined method `destroy' for nil:NilClass

この場合、何らかの理由でレールが destroy メソッドを理解していないか、レールが破棄するものを認識していないため、nil:NilClass になっているようです。

私の最初の質問は、どちらが当てはまるかを特定することです。

私の2番目の質問はそれを修正することです:D

ここに私のshow.htmlがあります:

<% provide(:title, "Log" ) %>
<% provide(:heading, "Your Progress Log") %>

<div class="row">  
  <div class="span8">
    <% if @user.status_update.any? %>
      <h3>Status Updates (<%= @user.status_update.count %>)</h3>    
      <table>
        <thead>
          <tr>
            <th>Entry Date</th>
            <th>Weight</th>
            <th>BF %</th>
            <th>LBM</th>
            <th>Fat</th>
            <th>Weight Change</th>
            <th>BF % Change</th>
            <th>Fat Change</th>
          </tr>
        </thead>
      <tbody class = "status updates">
          <%= render @status_updates %>
      </tbody>        
    <% end %>
  </div>
</div>

「<%= render @status_updates %>」は _status_update パーシャルを呼び出します。

 <tr>
 .
 .
 .
 . 
 <% if current_user==(status_update.user) %> 
 <td>
       <%= link_to "delete", status_update, method: :delete %>

 </td>
 <%  end  %>         

</tr>                                    

最後に、これが StatusUpdateController です。

def destroy
    @status_update.destroy
    redirect_to root_url
end

エラーページのパラメータは次のとおりです。

{"_method"=>"delete",
 "authenticity_token"=>"w9eYIUEd2taghvzlo7p3uw0vdOZIVsZ1zYIBxgfBymw=",
 "id"=>"106"}
4

1 に答える 1

12

を割り当てることができるコード(フィルターなど)を表示していないので、何もないと@status_update思います。したがって、メソッドのインスタンス変数@status_updatedestroy設定されていません。オブジェクトの ID を使用してクラスをクエリする必要があります。

destroy メソッドを次のように書き換えます。

def destroy
    @status_update = StatusUpdate.find(params[:id])
    if @status_update.present?
      @status_update.destroy
    end
    redirect_to root_url
end

注: classnameStatusUpdateを実際のクラス名に置き換えます。

于 2012-11-07T18:29:39.743 に答える