Неопределенный метод 'map' для nil: NilClass - PullRequest
9 голосов
/ 12 ноября 2009

Мое приложение, похоже, случайно выдает ошибку "неопределенный метод` 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. И когда я использую их ту же информацию, я могу обновить без проблем. Итак, я в тупике.

Ответы [ 2 ]

18 голосов
/ 12 ноября 2009

Лучшая догадка ...

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

6 голосов
/ 12 ноября 2009

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

EDIT:

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

...