【问题标题】:Undefined method 'map' for nil:NilClassnil:NilClass 的未定义方法“map”
【发布时间】:2009-11-12 17:28:03
【问题描述】:

当用户尝试更新他们的个人资料时,我的应用似乎随机抛出“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 更新。当我使用他们相同的信息时,我可以毫无问题地更新。所以,我被难住了。

【问题讨论】:

    标签: ruby-on-rails undefined


    【解决方案1】:

    最好的猜测...

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

    Render 不调用编辑函数,而只是渲染编辑视图。因此,在更新失败的情况下,您必须在从更新返回之前定义@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 = [...],你应该很好。

    【讨论】:

    • 嗨@tony-fontenot,你的建议也对我有用。谢谢
    • 3 年后......仍然为我节省了很多宝贵的时间 :)。谢谢
    • 这正是我遇到的问题。谢谢!有没有一种方法可以在一个地方设置@networkd_domestic 而不是同时编辑和更新?
    • @EricC - 在方法中设置它并使用引用该方法的 before_filter 回调。
    【解决方案2】:

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

    编辑:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2012-09-05
      • 2011-07-27
      • 2013-06-30
      相关资源
      最近更新 更多