Как геокодировать current_user_sign_in_ip после входа в систему

Итак, в настоящее время у меня есть приложение, размещенное на героку.

Я использую devise gem для аутентификации всех пользователей.

Я хочу, чтобы пользователь мог проверить свое текущее местоположение на карте, и для этого я использую гем геокодера.

Однако после входа в систему IP-адрес пользователей регистрируется, но их значения долготы и широты не меняются и остаются «нулевыми».

Если я зайду в свою консоль rails и дам current_sign_up_ip другое значение, тогда он начнет работать.

Вот как сейчас выглядит мой файл User.rb:

class User < ApplicationRecord
     attr_accessor :firstname, :lastname

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
   devise :database_authenticatable, :registerable, :recoverable,
      :rememberable, :trackable, :validatable,
      :omniauthable, :omniauth_providers => [:facebook , :google_oauth2]

  geocoded_by :current_sign_in_ip
  after_validation :geocode

   def self.from_omniauth(auth)
     where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
       user.provider = auth.provider
       user.uid = auth.uid
       user.email = auth.info.email
       user.password = Devise.friendly_token[0,20]
       user.firstname = auth.info.firstname
     end
  end
end

И вот как на данный момент выглядит мой вид, отображающий карту:

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>
<% if user_signed_in? %>
  <div style="'width: 800px">
   <div id = "map" style = "width: 800px; height: 400px;"></div>
  </div>


<script type="application/javascript">



handler = Gmaps.build('Google'); 
handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
  markers = handler.addMarkers([
    {
      "lat": (<%= current_user.latitude %>),
      "lng": (<%= current_user.longitude %>),
      "picture": {
        "url": 
"https://i.pinimg.com/736x/4e/e8/fb/4ee8fbf4312a171c9e344abb30c65e21.jpg",
       "width":  32,
       "height": 32
  },
  "infowindow": "hello!"
}
  ]);
  handler.bounds.extendWith(markers);
  handler.fitMapToBounds();
    });
   </script>




<% else %>

<% end %>

Таким образом, проблема, с которой я сталкиваюсь, заключается в том, что даже несмотря на то, что «current_sign_in_ip» имеет значение долготы и широты пользователя в точке, он не геокодируется.

Это работает, если я заставляю пользователя вводить свой текущий IP-адрес при входе в систему.


person googleplex    schedule 09.08.2018    source источник


Ответы (1)


Я проверил документы драгоценного камня Geocoder, кажется, это правильный способ настроить это. Я думаю, вам нужно отладить метод after_validation, добавив другой after_validation, который проверяет метод геокодирования, например:

after_validation :geocode_test

def geocode_test
  binding.pry # or debug if you don't use pry
  geocode
end

Должна быть какая-то причина, по которой он работает неправильно. Это может быть и в журнале вашего сервера, вы проверяли его на наличие ошибок?

person bo-oz    schedule 09.08.2018