Web Cralwers вызывает ошибку NoMethodError для nil:NilClass for Geocoder

Я получаю отчеты NoMethodError в своем приложении Rails 4 после того, как представил новый метод геокодирования местоположения страны посетителя.

В отчетах об ошибках говорилось, что я пытался получить доступ к методу нулевого объекта.

Дополнительная информация:

  • Рельсы 4.0.0
  • Руби 2.0.0
  • Геокодер 1.1.9

Сервер работает на Nginx и Phusion Passenger

Я пытался исправить эту ошибку в течение дня, но безуспешно.

Ниже приведен фрагмент используемого метода:

  def set_prefs
    if current_user
      userPrefs = Preflist.find_by_user_id(current_user.id)
      country = Country.find_by_id(userPrefs.country_id)
      session[:pref_country_id] = country.id
      session[:pref_gender] = userPrefs.gender
    else
      # This to make sure that the default @country have an object
      @country = Country.find_by_name('global')

      # Edited if else with unless as suggested by Holger Just
      unless Rails.env.test? || Rails.env.development?
        @geoCountry = Geocoder.search(request.remote_ip).first.country
        unless @geoCountry.blank?
          @newCountry = Country.find_by_name(@geoCountry.downcase())
          unless @newCountry.blank?
            @country = @newCountry
          end
        end
      end

      pref_country_id = session[:pref_country_id]

      if pref_country_id.nil?
        # The only line that request an .id from an Object
        session[:pref_country_id] = @country.id
      end

      pref_gender = session[:pref_gender]

      if pref_gender.nil?
        session[:pref_gender] = 0
      end

    end
end

Вот пример полного отчета

A NoMethodError occurred in things#map:
undefined method `id' for nil:NilClass
app/controllers/things_controller.rb:174:in `set_prefs'
# The reported line also keeps on changing, not just 174, which is kind of odd

-------------------------------
Request:
-------------------------------
* URL        :
* HTTP Method: GET
* IP address : 66.249.77.53
* Parameters :
* Timestamp  : 2014-07-02 16:42:38 +0800
* Server :
* Rails root :
* Process: 12911
-------------------------------
Session:
-------------------------------
* session id: [FILTERED]
* data: #<ActionDispatch::Request::Session:0x422f570 not yet loaded>
-------------------------------
Environment:
-------------------------------
* DOCUMENT_ROOT                                  :
* HTTPS                                          : on
* HTTP_ACCEPT                                    : */*
* HTTP_ACCEPT_ENCODING                           : gzip,deflate
* HTTP_CONNECTION                                : Keep-alive
* HTTP_FROM                                      : googlebot(at)googlebot.com
* HTTP_HOST                                      :
* HTTP_USER_AGENT                                : Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
* ORIGINAL_FULLPATH                              :
* ORIGINAL_SCRIPT_NAME                           : 
* PASSENGER_APP_ENV                              : production
* PASSENGER_APP_TYPE                             : rack
* PASSENGER_CONNECT_PASSWORD                     : [FILTERED]
* PATH_INFO                                      :
* QUERY_STRING                                   :
* REMOTE_ADDR                                    : 66.249.77.53
* REMOTE_PORT                                    : 42866
* REQUEST_METHOD                                 : GET
* REQUEST_URI                                    :
* ROUTES_33552780_SCRIPT_NAME                    : 
* SCGI                                           : 1
* SCRIPT_NAME                                    : 
* SERVER_ADDR                                    :
* SERVER_NAME                                    :
* SERVER_PORT                                    : 443
* SERVER_PROTOCOL                                : HTTP/1.1
* SERVER_SOFTWARE                                : nginx/1.4.4
* action_controller.instance                     : #<ThingsController:0x000000042fdb50>
* action_dispatch.backtrace_cleaner              : #<Rails::BacktraceCleaner:0x00000003b86fc0>
* action_dispatch.cookies                        : #<ActionDispatch::Cookies::CookieJar:0x00000004384768>
* action_dispatch.encrypted_cookie_salt          : encrypted cookie
* action_dispatch.encrypted_signed_cookie_salt   : signed encrypted cookie
* action_dispatch.http_auth_salt                 : http authentication
* action_dispatch.key_generator                  : #<ActiveSupport::CachingKeyGenerator:0x00000003cf5348>
* action_dispatch.logger                         : #<Logger:0x00000004071c60>
* action_dispatch.parameter_filter               : [:password]
* action_dispatch.redirect_filter                : []
* action_dispatch.remote_ip                      : 66.249.77.53
* action_dispatch.request.accepts                : [#<Mime::Type:0x000000071052f0 @synonyms=[], @symbol=nil, @string="*/*">]
* action_dispatch.request.content_type           : 
* action_dispatch.request.formats                : [#<Mime::Type:0x000000071052f0 @synonyms=[], @symbol=nil, @string="*/*">]
* action_dispatch.request.parameters             :
* action_dispatch.request.path_parameters        :
* action_dispatch.request.query_parameters       :
* action_dispatch.request.request_parameters     : {}
* action_dispatch.request.unsigned_session_cookie: {}
* action_dispatch.request_id                     : dd13eb0d-dbc9-4093-b7bc-013208ba7dc4
* action_dispatch.routes                         : #<ActionDispatch::Routing::RouteSet:0x00000003fff318>
* action_dispatch.secret_key_base                : 162e9bbc51d7fc7931ade00f2184de5bc3533b3f19d02bef4a2e30e8e67fb8fbe29e6655baa8033ca9fc1a591931c4964d413d57dc825d6bbae9c7e67293f576
* action_dispatch.secret_token                   : 
* action_dispatch.show_detailed_exceptions       : false
* action_dispatch.show_exceptions                : true
* action_dispatch.signed_cookie_salt             : signed cookie
* rack.errors                                    : #<IO:0x00000000aae178>
* rack.hijack                                    : #<Proc:0x000000041b8858@/home/deploy/.rvm/gems/ruby-2.0.0-p353/gems/passenger-4.0.35/lib/phusion_passenger/rack/thread_handler_extension.rb:69 (lambda)>
* rack.hijack?                                   : true
* rack.input                                     : #<PhusionPassenger::Utils::TeeInput:0x00000004186588>
* rack.multiprocess                              : true
* rack.multithread                               : false
* rack.request.cookie_hash                       : {}
* rack.request.query_hash                        :
* rack.request.query_string                      : 
* rack.run_once                                  : false
* rack.session                                   : #<ActionDispatch::Request::Session:0x0000000422f570>
* rack.session.options                           : #<ActionDispatch::Request::Session::Options:0x0000000422f098>
* rack.url_scheme                                : https
* rack.version                                   : [1, 2]

-------------------------------
Backtrace:
-------------------------------
app/controllers/things_controller.rb:174:in `set_prefs'

person Fandy    schedule 02.07.2014    source источник
comment
Вы должны использовать unless вместо пустого if только с elsepath. Это намного понятнее!   -  person Holger Just    schedule 02.07.2014
comment
Извините за плохой код, я использовал .present? сначала, что не помогает, поэтому я попытался использовать if .nil? только с другим путем. Изменит его на если. Спасибо!   -  person Fandy    schedule 02.07.2014
comment
Чувак, тебе не кажется, что было бы полезно подсказать, в какой строке номер 174? ^_^   -  person dre-hh    schedule 02.07.2014
comment
Ах, извините, если вы читали мои комментарии к отчету, сообщаемая строка постоянно менялась, в диапазоне от 160 до 178. Вот почему я не указал, какая строка имеет какой код.   -  person Fandy    schedule 03.07.2014
comment
В этом журнале ошибок его 174. Какая строка в этом фрагменте. Метод id вызывается в вашем коде дважды. У меня есть подозрение, что это первый session[:pref_country_id] = country.id. У вас как-то установлен current_user, но у него нет userPrefs для страны. Я бы ввел ведение журнала как для меньшего количества ветвей, так и для регистрации важной информации, такой как current_user, remote_ip, найденная страна и т. д., затем проверьте production.log   -  person dre-hh    schedule 06.07.2014


Ответы (1)


После дальнейшего изучения ошибка была исправлена.

Отчеты об ошибках, которые продолжали поступать каждые 5 минут, были связаны с тем, что гем «exception_notification» не мог отправить несколько отчетов одновременно, поэтому даже позже, скажем, в 12 часов ночи, он все еще отправлял отчеты об ошибках, которые произошли в 16:00.

Спасибо, друзья, прошу прощения за путаницу.

person Fandy    schedule 03.07.2014