LoginSignup
12
6

More than 5 years have passed since last update.

接続元IPアドレスを使って、国ごとに場合分けをする

Last updated at Posted at 2018-09-20

概要

IPアドレスを取得して、国ごとに対応したかったので、やったことをメモ

Railsでrequest.remote_ipをすることでIPを取れるわけだが、Local環境で使うと ::1 となるので、そこは注意しなければならない。
::1 は、 IPv4上では 127.0.0.1 , IPv6上では 0000:0000:0000:0000:0000:0000:0000:0001 のアドレスを省略される決まりがあるため、 ::1 が出力される。本番ではこのようなことはないが。学校で習っていたため知見はあったが、初めて見ると「あれ?」てなると思うので、一応参考までに。

実装

①application作成

  rails new sample -d mysql

②国ごとにIPを識別するgemを追加
https://dev.maxmind.com/geoip/geoip2/geolite2/
が提供している
https://github.com/yhirose/maxminddb
というgemを使う
他にも2つほどあるが、代表的ぽいやつを選抜。
Document通りにやって行けば問題なくこなせるが、ここに沿って実装していく

Gemfile
gem 'maxminddb'
bundle install

または

gem install maxminddb

③下記のページの Downloads という場所から
https://dev.maxmind.com/geoip/geoip2/geolite2/

・国ごとのバイナリデータ または csvデータ(GeoLite2 City)
・都市ごとのバイナリデータ または csvデータGeoLite2 Country)
のうち欲しいデータをダウンロードするする

ダウンロードしたデータを解凍して、db配下もしくはconfig配下に移動させる

④この説明はプロジェクトごとによって違うと思うが、僕の場合
db配下にダウンロードしたファイル(GeoLite2-Country.mmdb)を置いた場合は

config/application.rb
config.x.maxminddb = MaxMindDB.new("#{Rails.root}/db/GeoLite2-Country.mmdb")

と記述。

⑤最後に国の名前を取得する

関数を作る場所はどこでもいいが今回はわかりやすく application_contoller.rb に記述する

application_controller.rb
ip = request.remote_ip #localだと::1 今回は日本のIPアドレスが入っていたとする
ret = Rails.configuration.x.maxminddb.lookup(ip)

ret.found? # => true
ret.country.name # => 'Japan'
ret.country.iso_code # => 'JP'
ret.city.name(:...) # => 'cityを使った時に使えるOsaka,Tokyoとか'
ret.subdivisions.most_specific.name # => '都市名'
ret.location.latitude # => 000.000 緯度
ret.to_hash # => ハッシュ値

ex.
if ret.country.iso_code == 'JP'
 ...
elsif ret.country.iso_code == 'US'
  ...
end

まとめ

まぁGeo系やIP系の話はしってた方がいいかも。
webやってると触る機会多いし。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6