LoginSignup
5
5

More than 5 years have passed since last update.

Google Analytics API のデータをGarbで取得する場合 on Rails

Posted at

タイトル通りの内容です。開発環境は以下の通りです。

開発マシン
 OS: Windows 7 Home Premium SP1 x64
 Ruby: 2.0.0-p481 64bit
 

参考サイトはこちら

実装までに掛かった時間

8.5h

改修ポイント

・会員制サービスで使用することを想定し、認証情報はyamlファイルではなく、DBに格納したものを使う。
・ファイルを分離する。
 ・Garb::Modelを拡張したクラスを記述するファイルは別のクラスファイルにまとめて書く。
 ・期間設定を書いたハッシュはコントローラに書く。
 ・元ファイルは、ユーザ認証した結果だけを返す。

実ファイル

app直下にservicesディレクトリを作成し、認証用クラスファイルと拡張クラスファイルを作成。
ユーザ情報を格納しているテーブルに紐づく既存のコントローラ(users)へ実データの取得コードを書いています。

analytics_service.rb
require 'rubygems'
require 'garb'
require 'uri'
require 'active_support/time'
require 'yaml'

# 認証クラス
class AnalyticsService
  def load_profile(user_data)

    # セッションログイン
    Garb::Session.login(
        user_data.analytics_email,
        user_data.analytics_password
    )

    # プロファイル情報の取得
      profile = Garb::Management::Profile.all.detect { |p|
        p.web_property_id == user_data.property_id
        p.id == user_data.profile_id
      }
  end
end
analytics_service_class.rb
require 'rubygems'
require 'garb'
require 'uri'
require 'active_support/time'
require 'yaml'

# 拡張クラス
class AnalyticsServiceClass

  class PageTitle
      extend Garb::Model
      metrics :pageviews
      dimensions :date
  end
end
users_controller.rb(一部抜粋)
                :
  def show 
    @user = User.find(params[:id])
    analytics = AnalyticsService.new
    ga_profile = analytics.load_profile(@user)
    cond = {
        :start_date => Time.parse("2012-12-05"),
        :end_date   => Time.parse('2013-01-05'),
        # :filters    => { :page_path.contains => '^/items/' }
    }
      @data = AnalyticsServiceClass::PageTitle.results(ga_profile, cond)
  end
                :

@dataへ格納したデータは、ビューの中で表示させています。

エラー、バグ情報

json のバージョンが1.8.1 の状態でエラーが発生しました。

Garb::Management::Profile.all.detect メソッドを実行した際、以下のエラーが表示されます。

MultiJson::AdapterError (Did not recognize your adapter specification (193: %1 は有効な Win32 アプリケーションではありません。 - C:/Ruby200/lib/ruby/gems/2.0.0/gems/json-1.8.1/lib/json/ext/parser.so).):
app/services/analytics_service.rb:26:in load_profile' app/controllers/users_controller.rb:13:inshow'

直接の原因は不明ですが、google-api-client を使用して同じエラーが発生したので、どうやらAPI自体の不具合の可能性がしました。
そこで、json を 1.8.0 へ固定したところ、エラーは起きなくなりました。

Gemfileへ以下の記載を追加して、bundle update を実行しています。
gem 'json', '1.8.0'

感想

Railsは始めたばかりで経験も浅く、Ruby自体も大して経験がないのでクラスの設計はこれで良いのか?と自問自答しながら進めました。クラスを入れ子にするのが本当に良い方法なのか、未だわかっていませんし。
ただ、そういうことを調べながら進めて、出来なかったことが出来るようになるのは何とも言えず充実感があります。

また、このプログラムは Perlで書いたものをRailsに置き換えているつもりです。

5
5
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
5
5