2013-10-02 4 views
1

У меня есть модель, предложения, и я пытаюсь получить ip-адрес от пользователя и геокодировать координаты по широте и долготе. Документация камень указывает на то, что, где, как известно адрес IP код должен быть:Проблемы с Ruby Geocoder gem in Rails

Модель:

 geocoded_by :ip_address, :latitude => :latitude, :longitude => :longitude 

Однако у меня нет адреса IP-сохранены изначально, поэтому я изменил его к этому:

if :current_location 
self.ip_address = request.ip 
      geocoded_by :ip_address, :latitude => :latitude, :longitude => :longitude 
end 

request.ip - это метод из ActionView, который, как я считаю, не может быть вызван из модели. Я проверил это как вспомогательный метод, и он возвращает локальный адрес хоста. Но когда я пытаюсь сохранить его в этом формате, он ничего не сохраняет для модели.

Каков наилучший способ сохранить ip_address в модели, чтобы его можно было использовать в этом формате? Должен ли он быть извлечен для вспомогательного метода? Есть ли способ для include или require правильный модуль в модели?

Для справки руководство камня находится здесь: http://www.rubygeocoder.com

Все оцененная помощь, спасибо.

ответ

1

Возможно, вы захотите использовать класс Geocoder напрямую, вместо использования метода geocoded_by в модели. Я бы создал объект службы, который обрабатывает создание предложений. Вы можете найти координаты на ip_address, выполнив следующие действия:

Geocoder.coordinates(ip_address) # => [latitude, longitude] 

Я бы сделать что-то вроде следующего:

class OfferGeocoder 
    attr_reader :request, :params, :coordinates 

    def initialize options = {} 
    @request = options[:request] 
    @params = options[:params] 
    end 

    def coordinates 
    @coordinates ||= Geocoder.coordinates(request.remote_ip) 
    end 

    def create_offer 
    Offer.new(params.merge({ 
     latitude: coordinates.first, 
     longitude: coordinates.last 
    }) 
    end 
end 

В вашей создать действие контроллера вы можете позвонить:

def create 
    @offer = OfferGeocoder.new(params: offer_params, request: request).create_offer 
    if @offer.save 
    ... 
end 
+0

Спасибо, но я неохотно воссоздаю модель на этом этапе, так как теперь она немного сложна в дополнение к функциям геокодирования. Есть ли какие-либо другие драгоценные камни или простые способы получить IP-адрес пользователя и сохранить его в модели, которую вы использовали? Я собираюсь попробовать Geokit-рельсы и посмотреть, работает ли это лучше. – user2514224

0

ОК, так как метод request.ip не работает в модели, самый простой способ - через контроллер:

class OffersController<ApplicationController 

def create 
    @offer = Offer.new(offer_params) 
    if @offer.current_location 
    @offer.ip_address = request.ip 

... 
    end 
end 

Кроме того, метод request.ip не работает в режиме разработки, так как он возвращает адрес локального хоста, а не истинный IP-адрес.

Смежные вопросы