9

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

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

完整错误:

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

以下是最近一个错误的参数:

{"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 更新。当我使用他们相同的信息时,我可以毫无问题地更新。所以,我很难过。

4

2 回答 2

19

最佳的揣测...

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

渲染不调用编辑功能,而只是渲染编辑视图。因此,在更新失败的情况下,您必须@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 = [...],你应该很好。

于 2009-11-12T19:27:07.580 回答
6

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

编辑:

如果您查看源代码,options_from_collection_for_select您会发现它正在调用map您传递的集合(在这种情况下为@networks_domestic)。

于 2009-11-12T17:36:54.590 回答