5

La mia app crea correttamente righe per un tavolo ogni volta che un utente invia alcune statistiche. Ora voglio fornire un pulsante di cancellazione per poter cancellare alcune righe.metodo undefined `destroy 'per nil: NilClass

quando clicco sul pulsante Elimina ottengo l'errore:

undefined method `destroy' for nil:NilClass 

Sembra come sia binari non capisce il metodo destroy in questo caso per qualsiasi motivo, o rotaie non vede nulla di distruggere, da qui il nulla: NilClass.

La mia prima domanda è identificare quale è il caso, se uno di quelli.

La mia seconda domanda è fissandolo: D

Ecco la mia 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> 

Il "<% = rendono @status_updates%>" chiama la _status_update parziale.

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

</td> 
<% end %>   

</tr>          

E poi finalmente, ecco la StatusUpdateController

def destroy 
    @status_update.destroy 
    redirect_to root_url 
end 

Qui ci sono i parametri sulla pagina di errore:

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

@status_update non è definito nel controller. È necessario accedervi tramite parametri (parametri [: id]) o se si utilizzano risorse, resource.destroy. Controlla i tuoi percorsi di rake per assicurarti quali parametri utilizzare. –

+0

Stai assegnando '@ status_update' in un' before_filter' per il tuo metodo destroy? Altrimenti, è qui che si trova il tuo problema. –

risposta

9

Dato che non sta mostrando alcun codice (filtri o giù di lì) che potrebbe assegnare @status_update, presumo non ce ne sia nessuno. Quindi, la variabile di istanza @status_update nel tuo nel tuo metodo destroy non è impostata. È necessario interrogare la classe con l'ID dell'oggetto.

riscrivere il metodo destroy come segue:

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

Nota: Sostituire il nome di classe StatusUpdate con il nome di classe effettiva.

+0

Capisco. Sto seguendo un tutorial per un progetto diverso e c'erano alcuni bit di codice che non ho capito che ora vedo avere questo scopo esatto. Ha una funzione privata chiamata "utente corretto" che assegna l'istanza @status_update a un ID oggetto. Grazie per il vostro aiuto. –

+0

come e quando viene chiamato quel metodo? – HungryCoder

+0

Nel filtro precedente. Ho messo: before_filter: correct_user, solo:: distruggere E poi sotto privata che ho: privati ​​ def correct_user @status_update = current_user.status_update.find_by_id (params [: id]) redirect_to root_url se @ status_update.nil? fine –

Problemi correlati