2009-11-12 3 views
9

Mon application semble lancer une erreur "méthode non définie` map 'pour une erreur "NilClass" lorsque les utilisateurs tentent de mettre à jour leur profil.Méthode non définie 'map' pour nil: NilClass

Mais ce qui est bizarre, c'est de dire que l'erreur se produit à la mise à jour, mais la ligne d'erreur est en réalité dans une vue.

erreur complète:

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

Et voici les params d'une erreur récente:

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

Honnêtement pas sûr où commencer à chercher. J'ai demandé à un utilisateur de mettre à jour les mêmes informations d'IE mais pas de Firefox. Et quand j'utilise la même information, je peux mettre à jour sans problème. Donc, je suis perplexe.

Répondre

17

Meilleure estimation ...

Votre fonction d'édition définit correctement @networks_domestic donc tout est bien jusqu'à ce que vous rencontrez une erreur dans la fonction de mise à jour et appelez render :action => "edit".

Render n'appelle pas la fonction d'édition mais rend simplement la vue d'édition. Ainsi, dans le cas d'une mise à jour échouée, vous devrez définir @networks_domestic avant de retourner à partir de la mise à jour.

dire, par exemple, vous avez les éléments suivants:

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 

Vous obtiendrez l'erreur que vous décriviez parce @networkd_domestic ne définit pas la condition d'erreur dans la fonction de mise à jour.

Ajoutez @networkd_domestic = [...] avant le rendu d'édition et vous devriez être bon.

+0

hi @ tony-fontenot, votre suggestion a fonctionné pour moi aussi. Merci –

+0

3 ans plus tard ... et encore m'a sauvé beaucoup de temps précieux :). Merci – Hugo

+0

C'est précisément le problème que j'ai rencontré. Merci! Y a-t-il une approche pour définir @networkd_domestic à la fois au lieu de dans edit et update? – EricC

6

Est-ce que @networks_domentic est réglé correctement dans le contrôleur? Ajoutez <%= @networks_domestic.inspect %> juste avant la ligne 52 et voyez ce que vous obtenez. Vérifiez @networkd_domestic.nil? dans le contrôleur et assurez-vous que vous n'envoyez pas nil à la vue.

EDIT:

Si vous regardez la source de options_from_collection_for_select vous verrez qu'il appelle map sur la collecte que vous passez (@networks_domestic dans ce cas).

Questions connexes