概要
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通りにやって行けば問題なくこなせるが、ここに沿って実装していく
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.x.maxminddb = MaxMindDB.new("#{Rails.root}/db/GeoLite2-Country.mmdb")
と記述。
⑤最後に国の名前を取得する
関数を作る場所はどこでもいいが今回はわかりやすく application_contoller.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やってると触る機会多いし。