2013-10-02 55 views
1

我有一个模型,提供,并试图从用户获取IP地址,并通过经度和纬度对坐标进行地理编码。宝石文档表示,其中IP地址是已知的代码应该是:Rails中的Ruby Geocoder gem问题

型号:

 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

所有帮助表示赞赏,感谢。

回答

1

您可能希望直接使用Geocoder类,而不是在模型中使用geocode_by方法。我将创建一个处理Offer的创建的服务对象。

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

我会做类似如下:您可以通过执行以下步骤找到IP_ADDRESS的坐标

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-rails,看看它是否更好。 – 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地址。