我应该如何使用Geocoder的request.ip访问器来获取用户当前的ip?

时间:2017-12-12 19:47:00

标签: ruby-on-rails rails-geocoder

我很难找到如何在我的Rails应用程序中使用Geocoder gem来创建新的User实例时获取并保存IP地址。

Geocoder有一些有用的功能,例如获取当前ip位置的访问器和一些其他位置信息,但我对Rails非常新,如果文档有更多的指导,那将是完美的:-)

只要我使用ActiveRecord,我就开始创建以下迁移:

rails generate migration AddIpAddressToUser ip_address:float       

然后我将其添加到app / models / user.rb

geocoded_by :ip_address,
  :latitude => :lat, :longitude => :lon
after_validation :geocode

我运行迁移以在schema.rb上添加这些修改:

rails db:migrate            

现在有用户模型的当前架构:User.rb在其架构上有纬度,经度和ip_address。

在那里我怎么能使用以下方法?

  1. request.ip
  2. request.location

3 个答案:

答案 0 :(得分:0)

根据Rails documentation

  

对于每个请求,路由器确定控制器的值   和动作键。这些决定了哪个控制器和动作   调用。剩下的请求参数,即会话(如果是的话)   可用),并且包含所有HTTP标头的完整请求   通过访问器方法可用于操作。然后行动是   进行。

     

完整的请求对象可通过请求访问者

获得

因此,当用户访问您的网站或API调用发送到您的应用程序时,在控制器中,您可以访问request对象。由您决定如何使用这些数据。

例如,在控制器的index方法中,您可以使用以下内容:

def index
  geocoder_result = request.location
  #do something based on the geocoder_result
end

答案 1 :(得分:0)

在Rails中,模型不是请求意识。因此,要将IP分配给用户,您需要从控制器执行此操作:

class UserController < ApplicationController
  def create
    @user = User.new(user_params) do |u|
      u.ip_address = request.location
    end
    # ...
  end
end

如果您使用的是Devise,则可以覆盖build_resource方法:

# Adds request IP to the user to determine location.
class MyRegistrationsController < Devise::RegistrationsController
  def build_resource(hash={})
    super(hash.merge(ip_address: request.location))
  end
end

# routes.rb
devise_for :users, controllers: { registrations: "my_registrations"}

答案 2 :(得分:0)

您可以使用此

获取基于地理编码器的国家/地区位置信息

country = ISO3166 :: Country.new(Geocoder.search(ip).first.country_code)

我们正在使用它来获取该IP位置的国家/地区和默认货币的信息。