1

我有一个模型,报价,并试图从用户那里获取 IP 地址并按纬度和经度对坐标进行地理编码。gem 文档指出,在已知 ip 地址的地方,代码应该是:

模型:

      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 保存到模型以便以这种格式使用的最简洁方法是什么?是否应该将其提取到辅助方法中?模型中有没有办法includerequire正确的模块?

作为参考,宝石指南在这里:http ://www.rubygeocoder.com

感谢所有帮助,谢谢。

4

2 回答 2

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
于 2013-10-03T04:40:14.723 回答
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 地址。

于 2013-10-04T21:50:55.353 回答