Вопрос

Мое приложение, похоже, случайным образом выдает ошибку "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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top