2009-11-12 17 views
9

La mia app sembra lanciare casualmente un errore "map` per" nil: NilClass "quando gli utenti cercano di aggiornare il loro profilo.Metodo non definito 'map' per nil: NilClass

Ma ciò che è strano è che l'errore si verifica durante l'aggiornamento, ma la riga di errore è in realtà in una vista.

errore completa:

users#update (ActionView::TemplateError) "undefined method `map' for nil:NilClass" 

On line #52 of app/views/users/edit.html.erb 

Line 52: <%= options_from_collection_for_select(@networks_domestic, 'id', 'name', @user.network_id) %> 

Ed ecco i params da un recente errore:

{"user"=>{"email_notify"=>"[email protected]", "network_id"=>"", 
"password_confirmation"=>"[FILTERED]", "mobile"=>"", "password"=>"[FILTERED]", 
"email"=>"[email protected]"}, "action"=>"update", "_method"=>"put", "id"=>"5089", 
"controller"=>"users"} 

Onestamente non sono sicuro da dove cominciare nemmeno guardare. Ho avuto un utente che ha detto che può aggiornare le stesse informazioni da IE ma non da Firefox. E quando uso le loro stesse informazioni sono in grado di aggiornare senza problemi. Quindi, sono perplesso.

risposta

17

migliore ipotesi ...

tua funzione di modifica definisce correttamente @networks_domestic quindi tutto è grande fino a quando si verifica un errore nella funzione di aggiornamento e chiamare render :action => "edit".

Render non chiama la funzione di modifica ma piuttosto esegue il rendering della vista di modifica. Quindi, nel caso di un aggiornamento fallito dovrai definire @networks_domestic prima di tornare dall'aggiornamento.

Così dicono, per esempio, si ha la seguente:

def edit 
    @user = User.find(params[:id]) 
    @networkd_domestic = [...] 
    end 

    def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     flash[:notice] = "User was successfully updated." 
     format.html { redirect_to(admin_users_url) } 
     else 
     format.html { render :action => "edit" } 
     end 
    end 
    end 

Si otterrà l'errore che si sta descrivendo perché @networkd_domestic non è definita nella condizione di errore nella funzione di aggiornamento.

Aggiungi @networkd_domestic = [...] prima del rendering di modifica e si dovrebbe essere buono.

+0

hi @ tony-fontenot, il tuo suggerimento ha funzionato anche per me. Grazie –

+0

3 anni dopo ... e ancora mi ha risparmiato un sacco di tempo prezioso :). Grazie – Hugo

+0

Questo è esattamente il problema che ho riscontrato. Grazie! Esiste un approccio per impostare @networkd_domestic in un unico posto anziché in modifica e aggiornamento? – EricC

6

È @networks_domentic impostato correttamente nel controller? Aggiungi <%= @networks_domestic.inspect %> subito prima della linea 52 e guarda cosa ottieni. Controllare @networkd_domestic.nil? nel controller e assicurarsi di non inviare nil alla vista.

EDIT:

Se si guarda alla fonte per options_from_collection_for_select vedrete che si sta chiamando map sulla raccolta si passa (@networks_domestic in questo caso).

Problemi correlati