我無法讓地理編碼器正常工作,因爲我的本地IP地址是127.0.0.1,因此無法找到正確的位置。地理編碼器,當ip是127.0.0.1時如何在本地測試?
的request.location.ip顯示「127.0.0.1」
如何使用不同的IP地址(我的互聯網連接的IP),所以它會帶來更多的突破相關的數據?
我無法讓地理編碼器正常工作,因爲我的本地IP地址是127.0.0.1,因此無法找到正確的位置。地理編碼器,當ip是127.0.0.1時如何在本地測試?
的request.location.ip顯示「127.0.0.1」
如何使用不同的IP地址(我的互聯網連接的IP),所以它會帶來更多的突破相關的數據?
對於這個我通常使用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
我有同樣的問題。以下是我使用地理編碼器實施的方法。
#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
一個乾淨的方式做它正在使用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')
可能是一個noob點,但你必須添加一些東西,例如config/application.rb來自動加載該類,例如:config.autoload_paths + = Dir [「#{config。root}/lib/** /「] – Will 2013-01-02 00:51:30
我嘗試過這種方法很久以前很令人吃驚,最近在另一個應用程序嘗試了它沒有工作大約2小時後,我試圖降級地理編碼器的版本...它的工作!版本的地理編碼器我原來是我今天安裝的'1.1.2'版本是'1.1.6',所以必須在這些版本中更改 – DickieBoy 2013-01-17 12:56:56
@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
我實現了這個略有不同,這對我的情況很有效。
在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
我只是硬編碼一些地址,但你可以做任何你想在這裏。
我發現要讓'request.location'正常工作,我不得不修改這個答案,將'lookup_ip_location'方法重命名爲'location',並將其放在'ActionDispatch :: Request'類中。 – fabsays 2015-09-30 11:39:28
這是地理編碼器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
'alias_method_chain'在Rails 5中被棄用,所以這個答案不再是實際的 – Viktor 2017-11-13 12:15:24
你也可以做到這一點
request.safe_location
這對我來說返回的結果與'request.location'的結果相同。你看到什麼不同? – 2016-12-03 20:47:51
但如何將地理編碼工作的呢? – Blankman 2011-05-24 19:59:05
我不熟悉「地理編碼器」,我認爲它是一個寶石或東西,但我想有一些方法來配置它。我使用GeoIP進行地理編碼:http://geoip.rubyforge.org/,這很容易使用這種方法。 – 2011-05-24 20:41:15
您處於開發環境中,因此無法使用真正的請求IP地址。你需要找到一些方法來告訴「地理編碼器」,在開發中它應該使用另一個值。 – 2011-05-24 20:42:29