Google Places API Web Serviceのプレイス詳細リクエストから情報を取り出す

# 概要
* Google place_idから[プレイス詳細情報](https://developers.google.com/places/web-service/details?hl=ja)を取り出すために自作したrubyのクラス

# 事前準備
* ruby: 2.3.1（digメソッドを使っているため、2.3以上必須）
* Google Places API Web Serviceにアクセス出来るAPIキーを取得済みである
* Gem: httpclientを導入済みである

# 使い方
* irbを使って説明します。

1. google_placeid_detail.rbをloadで読み込む
   * 文末のgoogle_placeid_detail.rbのコードをカレントディレクトリに保存している事を想定しています

	```
	$ irb
	> load './google_placeid_detail.rb'	
	```

2. オブジェクト作成

	```
	> placeid_info = GooglePlaceidDetail.new
	```

3. apikeyを設定
   * YOUR_API_KEYは自分のAPIKEYを入力してください

	```
	> placeid_info.apikey = 'YOUR_API_KEY'
	```
	* apikeyは、[こちら](https://developers.google.com/places/web-service/?hl=ja)の文末の「キーを取得」をクリックして取得してください。

4. place_idデータ取得
   * place_idを引数としてplace_idデータを取得する

		```
		> placeid_info.create('ChIJDZcTCXeLGGARU7MVy39Gw8w')
		```
	* place_idがわからない場合は、[こちら](https://developers.google.com/maps/documentation/javascript/examples/places-placeid-finder?hl=ja)から検索してください。


5. キーに対応する値を取り出す
   * キーを引数として値を取り出す

		```
		> placeid_info.get('status')
		=> "OK"	
		> placeid_info.get('name')
		=> "グーグル合同会社"
		> placeid_info.get('formatted_address')
		=> "日本, 〒106-6126 東京都港区六本木６丁目１０−１ 六本木ヒルズ森タワー"
		```
    * prefectureとcityというキーは存在しませんが、対応する値にアクセス出来るようにしています。
	
		```
		> placeid_info.get('prefecture')
		=> "東京都"
		> placeid_info.get('city')
		=> "港区"
		```
    * lat（lngも同様）は3種類ありますが、location_latやviewport_northeast_latやviewport_southwest_latとすることでアクセス出来ます。
	
		```
		> placeid_info.get('location_lat')
		=> 35.660411
		> placeid_info.get('viewport_northeast_lat')
		=> 35.6617599802915
		> placeid_info.get('viewport_southwest_lat')
		=> 35.6590620197085
		```
    * なおlat, lngは、location_latとlocation_lngと同じです。
	
		```
		> placeid_info.get('location_lat')
		=> 35.660411
		> placeid_info.get('lat')
		=> 35.660411
		> placeid_info.get('location_lng')
		=> 139.729265
		> placeid_info.get('lng')
		=> 139.729265
		
		```

# google_placeid_detail.rb

```google_placeid_detail.rb
require 'json'
require 'httpclient'

class GooglePlaceidDetail
  attr_accessor :apikey, :placeid, :language, :placeid_response
  GSEARCHURL = 'https://maps.googleapis.com/maps/api/place/details/json'.freeze
  DEFAULTAPIKEY = 'YOUR_APIKEY'.freeze

  def initialize(options = {})
    @apikey = options[:apikey] || DEFAULTAPIKEY
    @placeid = options[:placeid]
    @language = options[:language] || 'ja'
    create(@placeid) if @placeid
  end

  # pladeidにひもづく詳細データをAPIで取得する
  def create(placeid = @placeid)
    client = HTTPClient.new(default_header: { 'Accept-Language' => @language })
    response = client.get(GSEARCHURL,
                          query: {
                            placeid: placeid,
                            languqage: @language,
                            key: @apikey
                          })
    sleep(1)
    @placeid_response = JSON.load(response.body)
    self
  end

  # キー（key）に対応した値（value）を詳細データ（placeid_response）から取り出す
  def get(key = nil, placeid_response = @placeid_response)
    if placeid_response.nil?
      p 'Please .create(place_id)'
      return
    end
    return nil if key.nil?
    value = case key
            when 'status'
              placeid_response.dig(key)
            when 'location_lat', 'lat'
              placeid_response.dig('result', 'geometry', 'location', 'lat')
            when 'location_lng', 'lng'
              placeid_response.dig('result', 'geometry', 'location', 'lng')
            when 'viewport_northeast_lat'
              placeid_response.dig('result', 'geometry', 'viewport', 'northeast', 'lat')
            when 'viewport_northeast_lng'
              placeid_response.dig('result', 'geometry', 'viewport', 'northeast', 'lng')
            when 'viewport_southwest_lat'
              placeid_response.dig('result', 'geometry', 'viewport', 'southwest', 'lat')
            when 'viewport_southwest_lng'
              placeid_response.dig('result', 'geometry', 'viewport', 'southwest', 'lng')
            when 'postal_code', 'country', 'ward', 'administrative_area_level_2', 'route', 'street_number', 'floor', 'sublocality_level_1', 'sublocality_level_2', 'sublocality_level_3', 'sublocality_level_4', 'sublocality_level_5'
              address_component = placeid_response['result']['address_components'].select { |a| a['types'].include?(key) }
              address_component[0]['long_name'] unless address_component.empty?
            when 'administrative_area_level_1', 'prefecture'
              address_component = placeid_response['result']['address_components'].select { |a| a['types'].include?('administrative_area_level_1') }
              address_component[0]['long_name'] unless address_component.empty?
            when 'city'
              address_component = placeid_response['result']['address_components'].select { |a| a['types'].include?('locality') && !a['types'].include?('ward') }
              address_component[0]['long_name'] unless address_component.empty?
            when 'open_now', 'weekday_text'
              placeid_response.dig('result', 'opening_hours', key)
            else
              placeid_response.dig('result', key)
            end
    value
  end
end
```

# 解説
* initializeでインスタンス変数を設定します。
	* なお、GooglePlaceidDetail.new(apikey: 'YOUR_API_KEY', placeid: 'PLACEID')とするとcreate('PLACEID')も実行します。
* create('PLACEID')でplaceidの詳細情報をハッシュで取得します。
* get('KEY')でplaceidの詳細情報からKEYに対応する値にアクセス出来ます。
	* reviews, photos, opening_hoursのサブカテゴリへのKEYによる直接アクセスは対応していません。
	* 必要ならば、.placeid_responseでハッシュにアクセスするか、もしくはwhen 'postal_code' ... の箇所を参考にキーに対応するコードを追加するなど#getを拡張してください。