タイトル通りの内容です。開発環境は以下の通りです。
開発マシン
OS: Windows 7 Home Premium SP1 x64
Ruby: 2.0.0-p481 64bit
参考サイトはこちら
実装までに掛かった時間
8.5h
改修ポイント
・会員制サービスで使用することを想定し、認証情報はyamlファイルではなく、DBに格納したものを使う。
・ファイルを分離する。
・Garb::Modelを拡張したクラスを記述するファイルは別のクラスファイルにまとめて書く。
・期間設定を書いたハッシュはコントローラに書く。
・元ファイルは、ユーザ認証した結果だけを返す。
実ファイル
app直下にservicesディレクトリを作成し、認証用クラスファイルと拡張クラスファイルを作成。
ユーザ情報を格納しているテーブルに紐づく既存のコントローラ(users)へ実データの取得コードを書いています。
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
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
:
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に置き換えているつもりです。