Неопределенный метод 'map' для nil:NilClass
-
19-09-2019 - |
Вопрос
Мое приложение, похоже, случайным образом выдает ошибку "undefined method `map' for 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.И когда я использую их ту же информацию, я могу обновлять ее без проблем.Итак, я в тупике.
Решение
Лучшее предположение...
Ваша функция редактирования правильно определяет @networks_domestic
так что все отлично, пока вы не столкнетесь с ошибкой в функции обновления и не вызовете render :action => "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 = [...]
перед редактированием сделайте рендеринг, и у вас все должно быть хорошо.
Другие советы
Является @networks_domentic
правильная настройка в контроллере?Добавить <%= @networks_domestic.inspect %>
прямо перед строкой 52 и посмотрите, что у вас получится.Проверьте наличие @networkd_domestic.nil?
в контроллере и убедитесь, что вы не отправляете nil
к виду.
Редактировать:
Если вы посмотрите на источник для options_from_collection_for_select
вы увидите, что это зовет map
о коллекции, которую вы передаете (в данном случае @networks_domestic).