2011-05-24 36 views

回答

4

對於這個我通常使用params[:ip]或在開發中的東西。這允許我測試其他IP地址的功能,並假裝我在世界任何地方。

例如

class ApplicationController < ActionController::Base 
    def request_ip 
    if Rails.env.development? && params[:ip] 
     params[:ip] 
    else 
     request.remote_ip 
    end 
    end 
end 
+1

但如何將地理編碼工作的呢? – Blankman 2011-05-24 19:59:05

+0

我不熟悉「地理編碼器」,我認爲它是一個寶石或東西,但我想有一些方法來配置它。我使用GeoIP進行地理編碼:http://geoip.rubyforge.org/,這很容易使用這種方法。 – 2011-05-24 20:41:15

+0

您處於開發環境中,因此無法使用真正的請求IP地址。你需要找到一些方法來告訴「地理編碼器」,在開發中它應該使用另一個值。 – 2011-05-24 20:42:29

1

我有同樣的問題。以下是我使用地理編碼器實施的方法。

#gemfile 
gem 'httparty', :require => 'httparty', :group => :development 

#application_controller 
def request_ip 
    if Rails.env.development? 
    response = HTTParty.get('http://api.hostip.info/get_html.php') 
    ip = response.split("\n") 
    ip.last.gsub /IP:\s+/, ''  
    else 
    request.remote_ip 
    end 
end 

#controller 
ip = request_ip 
response = Geocoder.search(ip) 

(代碼部分與geo_magic寶石hostip.info,並根據對方的回答了這個問題。)

現在你可以做一些像response.first.state

21

一個乾淨的方式做它正在使用MiddleWare。這個類添加到您的lib目錄:

# lib/spoof_ip.rb 

class SpoofIp 
    def initialize(app, ip) 
    @app = app 
    @ip = ip 
    end 

    def call(env) 
    env['HTTP_X_FORWARDED_FOR'] = nil 
    env['REMOTE_ADDR'] = env['action_dispatch.remote_ip'] = @ip 
    @status, @headers, @response = @app.call(env) 
    [@status, @headers, @response] 
    end 
end 

然後找到你想用你的開發環境,並添加到您的development.rb文件中的IP地址:

config.middleware.use('SpoofIp', '64.71.24.19') 
+1

可能是一個noob點,但你必須添加一些東西,例如config/application.rb來自動加載該類,例如:config.autoload_paths + = Dir [「#{config。root}/lib/** /「] – Will 2013-01-02 00:51:30

+0

我嘗試過這種方法很久以前很令人吃驚,最近在另一個應用程序嘗試了它沒有工作大約2小時後,我試圖降級地理編碼器的版本...它的工作!版本的地理編碼器我原來是我今天安裝的'1.1.2'版本是'1.1.6',所以必須在這些版本中更改 – DickieBoy 2013-01-17 12:56:56

+6

@DickieBoy,你說得對,該方法不適用於地理編碼器1.1。 6由於以下[更改](https://github.com/alexreisner/geocoder/commit/f67defd8d2b25511023be21c318aef42562058b2)。解決方案使env ['HTTP_X_FORWARDED_FOR'] = nil,但它不會從密鑰中刪除密鑰它通過'location'方法進行選擇,並且通過地理編碼器搜索nil。在我的情況下評論這條線的作用 – deivid 2013-02-18 15:13:47

4

我實現了這個略有不同,這對我的情況很有效。

application_controller.rb我有一個查找方法,它調用Geocoder IP查找直接傳入request.remote_ip的結果。

def lookup_ip_location 
    if Rails.env.development? 
    Geocoder.search(request.remote_ip).first 
    else 
    request.location 
    end 
end 

然後在config/environments/development.rb我猴子打補丁的remote_ip電話:

class ActionDispatch::Request 
    def remote_ip 
    "71.212.123.5" # ipd home (Denver,CO or Renton,WA)                                                                   
    # "208.87.35.103" # websiteuk.com -- Nassau, Bahamas                                                                  
    # "50.78.167.161" # HOL Seattle, WA                                                                      
    end 
end 

我只是硬編碼一些地址,但你可以做任何你想在這裏。

+0

我發現要讓'request.location'正常工作,我不得不修改這個答案,將'lookup_ip_location'方法重命名爲'location',並將其放在'ActionDispatch :: Request'類中。 – fabsays 2015-09-30 11:39:28

1

這是地理編碼器1.2.9的更新答案,爲開發和測試環境提供硬編碼IP。只要將這個在你config/initilizers/geocoder.rb的底部:

if %w(development test).include? Rails.env 
    module Geocoder 
    module Request 
     def geocoder_spoofable_ip_with_localhost_override 
     ip_candidate = geocoder_spoofable_ip_without_localhost_override 
     if ip_candidate == '127.0.0.1' 
      '1.2.3.4' 
     else 
      ip_candidate 
     end 
     end 
     alias_method_chain :geocoder_spoofable_ip, :localhost_override 
    end 
    end 
end 
+0

'alias_method_chain'在Rails 5中被棄用,所以這個答案不再是實際的 – Viktor 2017-11-13 12:15:24

-1

你也可以做到這一點

request.safe_location 
+0

這對我來說返回的結果與'request.location'的結果相同。你看到什麼不同? – 2016-12-03 20:47:51

相關問題