5

Meine App erstellt erfolgreich Zeilen für eine Tabelle jedes Mal, wenn ein Benutzer einige Statistiken übermittelt. Jetzt möchte ich eine Lösch-Schaltfläche zur Verfügung stellen, um einige Zeilen löschen zu können.undefined Methode `destroy 'für Nil: NilClass

Wenn ich auf die Schaltfläche Löschen klicken erhalte ich die Fehlermeldung:

undefined method `destroy' for nil:NilClass 

wie entweder Schienen scheint die aus irgendeinem Grund Methode in diesem Fall zerstören nicht versteht, oder Schienen sehen nicht, etwas zu zerstören, daher das Nil: NilClass.

Meine erste Frage ist zu identifizieren, was der Fall ist, wenn einer von denen.

Meine zweite Frage ist Fixierung: D

Hier ist mein 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> 

Die "<% = render @status_updates%>" ruft der _status_update Teil.

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

</td> 
<% end %>   

</tr>          

Und dann endlich, hier ist die StatusUpdateController

def destroy 
    @status_update.destroy 
    redirect_to root_url 
end 

Hier sind die Parameter auf der Fehlerseite:

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

@status_update ist in Ihrem Controller nicht definiert. Sie müssen über Parameter (params [: id]) darauf zugreifen oder wenn Sie resources.destroy verwenden. Überprüfen Sie Ihre Rake-Routen, um sicher zu gehen, welche Parameter verwendet werden sollen. –

+0

Ordnen Sie '@ status_update' in einem' before_filter' für Ihre Methode desintroduction zu? Wenn nicht, dann ist das dein Problem. –

Antwort

9

Wie Sie keinen Code zeigen (Filter oder so) das könnte @status_update zuweisen, nehme ich an, es gibt keine. Daher wird die Instanzvariable @status_update in Ihrer destroy-Methode nicht festgelegt. Sie müssen die Klasse mit der ID des Objekts abfragen.

Ihre Methode zerstören Rewrite wie folgt:

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

Hinweis: Ersetzen Sie den Klassennamen StatusUpdate mit Ihrem tatsächlichen Klassennamen.

+0

Ich verstehe. Ich folge einem Tutorial für ein anderes Projekt und es gab einige Code-Teile, die ich nicht verstanden habe. Ich sehe jetzt genau diesen Zweck. Es hat eine private Funktion namens "korrekter Benutzer", die die @ Status_update-Instanz einer Objekt-ID zuweist. Danke für Ihre Hilfe. –

+0

Wie & wann diese Methode aufgerufen wird? – HungryCoder

+0

Im Vorfilter. Ich habe: before_filter: correct_user, nur: zerstören und dann unter eigenem ich habe: privaten def correct_user @status_update = current_user.status_update.find_by_id (params [: id]) redirect_to root_url wenn @ status_update.nil? Ende –