Ruby
Rails
IPアドレス

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

概要

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やってると触る機会多いし。