我的控制器中有一个函数,它调用另一个需要输入ip地址的模型的函数
def get_location_users
if current_user
return current_user.location_users
else
l = Location.find_by_ip(request.remote_ip)
lu = LocationUser.new({:location_id => l.id, :radius => Setting.get("default_radius").to_i})
return [lu]
end
end
从我收集的remote.request_ip给你ip地址,但是当我用request.remote_ip调用该函数时,对象是nil。如果我输入静态IP地址虽然它产生正确的输出。如果remote.request_ip不这样做,获取IP地址的正确方法是什么?
当我尝试在控制台中输入“request.remote_ip”时,它会从“main”返回“未定义的局部变量或方法”请求
答案 0 :(得分:6)
您的问题中是否有拼写错误,或者您是否真的在调用remote.request_ip?
正确的方法是request.remote_ip
答案 1 :(得分:3)
这看起来应该在模型中的代码,所以我假设这是该方法的位置。如果是这样,你不能(至少“开箱即用”)从你的模型访问请求对象,因为它来自HTTP请求 - 这也是你从主要获得“未定义的局部变量或方法”请求的原因“在你的控制台里。
如果你的模型中没有这个方法,我会把它放在那里,然后从你的控制器调用它并传入request.remote_ip作为参数。
def get_location_users(the_ip)
if current_user
return current_user.location_users
else
l = Location.find_by_ip(the_ip)
lu = LocationUser.new({:location_id => l.id, :radius => Setting.get("default_radius").to_i})
return [lu]
end
end
然后,在你的控制器::
SomeModel.get_location_users(request.remote_ip)
另外,请注意,如果没有匹配的记录,“Location.find_by_ip”将返回nil。
并且,您可以使用 app.get“some-url”在控制台中发出请求,然后您可以从请求对象 app.request.remote_ip >访问request_ip strong>并在需要时使用它进行测试。
答案 2 :(得分:2)
HTTP请求: request.ip
(正如塞巴斯蒂安在回答中指出的那样)
也可用作:request.env['action_dispatch.request_id']
HTTPS请求: request.env['HTTP_X_FORWARDED_FOR'].split(/,/).try(:first)