2009-11-12 16 views
9

Parece que mi aplicación arroja aleatoriamente un "mapa de método no definido 'para el error nil: NilClass" cuando los usuarios intentan actualizar su perfil.Método no definido 'map' for nil: NilClass

Pero lo que es raro es decir que el error ocurre en la actualización, pero la línea de error está realmente en una vista.

de error completo:

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) %> 

Y aquí están los parametros de un error reciente:

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

Honestamente no sabe dónde ni siquiera empezar a buscar. He tenido un usuario que dice que puede actualizar la misma información desde IE pero no desde Firefox. Y cuando uso su misma información, puedo actualizar sin problemas. Entonces, estoy perplejo.

Respuesta

17

mejor conjetura ...

Su función de edición define adecuadamente @networks_domestic así que todo está bien hasta que se produzca un error en la función de actualización y llamar render :action => "edit".

Render no llama a la función de edición, sino que simplemente procesa la vista de edición. Entonces, en el caso de una actualización fallida, deberá definir @networks_domestic antes de regresar de la actualización.

Así decir, por ejemplo, se tiene lo siguiente:

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 

Usted recibirá el error que usted está describiendo porque @networkd_domestic no está definido en la condición de error en la función de actualización.

Agregue @networkd_domestic = [...] antes de editar y debe estar bien.

+0

Hola @ tony-fontenot, tu sugerencia me funcionó también. Gracias –

+0

3 años después ... y todavía me ahorró un montón de tiempo valioso :). Gracias – Hugo

+0

Este es precisamente el problema que encontré. ¡Gracias! ¿Existe un enfoque para establecer @networkd_domestic en un solo lugar en lugar de editar y actualizar? – EricC

6

¿Está @networks_domentic ajustado correctamente en el controlador? Agregue <%= @networks_domestic.inspect %> justo antes de la línea 52 y vea lo que obtiene. Compruebe @networkd_domestic.nil? en el controlador y asegúrese de no enviar nil a la vista.

EDIT:

Si nos fijamos en la fuente para options_from_collection_for_select verá que está llamando map en la colección que pasa (@networks_domestic en este caso).

Cuestiones relacionadas