【问题标题】:Error when requesting IP address with request.ip使用 request.ip 请求 IP 地址时出错
【发布时间】:2015-12-14 09:46:34
【问题描述】:

当我想请求 IP 地址并知道它是什么时,我不确定它是如何工作的。现在我正在开发中,我正在使用 rails 沙盒控制台:

user$ rails console --sandbox
Loading development environment in sandbox (Rails 4.2.3)
Any modifications you make will be rolled back on exit
irb(main):001:0> ip = request.ip

然后它返回:

NameError: undefined local variable or method `request' for main:Object
    from (irb):1
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/railties-4.2.3/lib/rails/commands/console.rb:110:in `start'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/railties-4.2.3/lib/rails/commands/console.rb:9:in `start'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/railties-4.2.3/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/railties-4.2.3/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/railties-4.2.3/lib/rails/commands.rb:17:in `<top (required)>'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:274:in `require'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:274:in `block in require'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:274:in `require'
    from /home/user/app/bin/rails:8:in `<top (required)>'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:268:in `load'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:268:in `block in load'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.3/lib/active_support/dependencies.rb:268:in `load'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/commands/rails.rb:6:in `call'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/command_wrapper.rb:38:in `call'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/application.rb:183:in `block in serve'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/application.rb:156:in `fork'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/application.rb:156:in `serve'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/application.rb:131:in `block in run'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/application.rb:125:in `loop'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/application.rb:125:in `run'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/spring-1.3.6/lib/spring/application/boot.rb:18:in `<top (required)>'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /home/user/.rbenv/versions/2.2.2/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from -e:1:in `<main>'irb(main):002:0>

我不知道这里发生了什么。我试图让 Geocoder 通过在我的应用程序控制器中执行此操作将匿名用户的 IP 地址转换为街道地址:

  def set_location
    ip = request.ip
    @user_location = Geocoder.search(ip)
  end

但它不起作用,因为我猜测没有 ip。如何正确请求用户 ip?

【问题讨论】:

    标签: ruby-on-rails rails-geocoder


    【解决方案1】:

    在 Rails 控制台中,您没有请求对象。

    如果你想调试请求并且它是 ip,你应该在控制器或视图级别进行。同样为了简化它,您应该考虑在其binding.pry 方法中使用 Pry 控制台。您可以在控制器操作中调用此方法:

    def index
      binding.pry
      # some code here
    end
    

    或者在视图中使用它:

    <% binding.pry %>
    

    【讨论】:

      【解决方案2】:

      这里没有请求对象。

      在 rails 应用程序内部:

      request.remote_ip
      

      Reference link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-21
        • 2011-07-31
        • 1970-01-01
        • 2021-02-11
        • 2023-04-10
        • 2018-07-04
        • 1970-01-01
        • 2019-07-12
        相关资源
        最近更新 更多