【问题标题】:How do I get a client's ip address in Rails?如何在 Rails 中获取客户的 IP 地址?
【发布时间】:2012-11-09 22:58:28
【问题描述】:

我的控制器中有一个函数,它从需要输入 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 调用该函数时,该对象为零。如果我输入一个静态 IP 地址,尽管它会产生正确的输出。如果 remote.request_ip 不这样做,那么获取 IP 地址的正确方法是什么?

当我尝试在控制台中输入“request.remote_ip”时,它会返回“未定义的局部变量或方法“请求”来自 main”

【问题讨论】:

  • 您是在开发中还是在生产中测试它?此外,它在 Rails 控制台上不起作用是正常的,因为 Rails 控制台不响应 http 调用,因此没有请求对象。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

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

正确的方法是request.remote_ip

【讨论】:

    【解决方案2】:

    这看起来像是应该在模型中的代码,所以我假设这就是该方法所在的位置。如果是这样,您不能(至少“开箱即用”)从模型访问请求对象,因为它源自 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 strong> 并在需要时将其用于测试。

    【讨论】:

    • 这是正确的。 request 对象仅在请求的上下文中可用,这意味着:控制器和视图。它在模型(或邮件)中不可用。因此,您必须获取 ip 并将其传递给模型方法,如本例所示。
    【解决方案3】:
    • HTTP 请求: request.ip(正如 sebastianh 在他的回答中指出的那样)

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2013-11-09
      • 2012-03-14
      • 2012-02-16
      • 2015-12-20
      • 2016-03-29
      • 2021-10-22
      相关资源
      最近更新 更多