我很难找到如何在我的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。
在那里我怎么能使用以下方法?
答案 0 :(得分:0)
对于每个请求,路由器确定控制器的值 和动作键。这些决定了哪个控制器和动作 调用。剩下的请求参数,即会话(如果是的话) 可用),并且包含所有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位置的国家/地区和默认货币的信息。