4

我的控制器中有一个函数,它从需要输入 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”时,它会返回“未定义的局部变量或方法”request” from main”

4

3 回答 3

6

您的问题是否有错字,或者您是否真的在调用 remote.request_ip?

正确的方法是request.remote_ip

于 2012-11-21T16:26:43.873 回答
3

这看起来像是应该在模型中的代码,所以我假设这就是该方法所在的位置。如果是这样,您不能(至少“开箱即用”)从您的模型访问请求对象,因为它源自 HTTP 请求——这也是您从 main 获得“未定义的局部变量或方法“请求”的原因“在您的控制台中。

如果这个方法还没有在你的模型中,我会把它放在那里,然后从你的控制器调用它并传入 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并在需要时使用它进行测试。

于 2012-11-21T17:44:35.430 回答
2
  • HTTP 请求:( request.ip正如 sebastianh 在他的回答中指出的那样)

    也可作为:request.env['action_dispatch.request_id']

  • HTTPS 请求: request.env['HTTP_X_FORWARDED_FOR'].split(/,/).try(:first)

于 2012-11-21T18:49:59.520 回答