2009-11-12 3 views
9

Мое приложение, похоже, случайно выбрасывает «неопределенный метод« карта »для ошибки nil: NilClass, когда пользователи пытаются обновить свой профиль.Неопределенный метод '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) %> 

А вот PARAMS от недавней ошибки:

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

Честно говоря, не уверен, где даже начать поиск. У меня был пользователь, он может обновить ту же информацию от IE, но не от Firefox. И когда я использую их ту же информацию, я могу обновить ее без проблем. Итак, я в тупике.

ответ

17

Лучшее предположение ...

Ваша правка функция корректно определяет @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 = [...] перед редактированием, и вы должны быть хорошими.

+0

привет @ tony-fontenot, ваше предложение тоже работало для меня. Спасибо –

+0

3 года спустя ... и все же спас мне много полезного времени :). Спасибо – Hugo

+0

Это именно та проблема, с которой я столкнулся. Благодаря! Есть ли подход к установке @networkd_domestic в одном месте, а не в редактировании и обновлении? – EricC

6

@networks_domentic Правильно ли установлен в контроллере? Добавьте <%= @networks_domestic.inspect %> прямо перед строкой 52 и посмотрите, что вы получаете. Проверьте на @networkd_domestic.nil? в контроллере и убедитесь, что вы не отправляете nil.

EDIT:

Если вы посмотрите на источник options_from_collection_for_select вы увидите, что он звонит map на коллекции вы передаете (@networks_domestic в данном случае).