当用户试图更新他们的个人资料时,我的应用程序似乎随机抛出了一个“未定义的方法`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: <%= 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更新。当我使用相同的信息时,我可以毫无问题地更新。所以,我很难过。
答案 0 :(得分:18)
最佳猜测......
您的编辑功能正确定义了@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 = [...]
,你应该很好。
答案 1 :(得分:6)
是否在控制器中正确设置了@networks_domentic
?在第52行之前添加<%= @networks_domestic.inspect %>
,看看你得到了什么。检查控制器中的@networkd_domestic.nil?
,确保您没有向视图发送nil
。
编辑:
如果您查看options_from_collection_for_select
的来源,您会看到它在您传递的集合上调用map
(在这种情况下为@networks_domestic)。