nil的未定义方法’map’:NilClass

当用户试图更新他们的个人资料时,我的应用程序似乎随机抛出一个“未定义的方法`map’为nil:NilClass”错误。

但奇怪的是,它说错误发生在更新上,但错误行实际上在视图中。

完整错误:

users#update (ActionView::TemplateError) "undefined method `map' for nil:NilClass" On line #52 of app/views/users/edit.html.erb Line 52:  

以下是最近错误中的参数:

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

老实说,不确定从哪里开始寻找。 我有一个用户说他可以从IE更新相同的信息,但不能从Firefox更新。 当我使用相同的信息时,我可以毫无问题地更新。 所以,我很难过。

最佳的揣测…

您的编辑function正确定义了@networks_domestic所以一切都很好,直到您在更新函数中遇到错误并调用render :action => "edit"

渲染不会调用编辑function,而只是渲染编辑视图。 因此,在更新失败的情况下,您必须在从更新返回之前定义@networks_domestic

例如,比方说,您有以下内容:

  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 

您将收到您描述的错误,因为更新函数中的错误条件中未定义@networkd_domestic

在编辑渲染之前添加@networkd_domestic = [...] ,你应该很好。

@networks_domentic是否在控制器中正确设置? 在第52行之前添加<%= @networks_domestic.inspect %> ,看看你得到了什么。 检查@networkd_domestic.nil? 在控制器中,并确保您不向视图发送nil

编辑:

如果查看options_from_collection_for_select的源代码,您将看到它在您传递的集合上调用map (在本例中为@networks_domestic)。