Rails4でTwitterStreamingAPIを使う その2


Ruby2.0，Rails4で確認

#### 前回：[ハッシュタグがyoutubeとなっているtweetを取得してlogに表示する](http://qiita.com/hilotter/items/1fab4e284b1211738880)

というところまでやりました。

今回は

## 目標：取得したtweetをMongoDBに入れて簡単なAPIを作ってみる

ところまでやってみます。

[MongoDBのインストール方法等を含めた詳細に関してはブログにまとめました](http://blog.hello-world.jp.net/?p=843)

## Railsアプリケーション実装

### mongoid初期設定

* mongoid gem追加

```Gemfile
gem 'mongoid', git: 'git://github.com/mongoid/mongoid.git'
```

* bundle install

```
./bin/bundle install
```

* mongoid設定ファイルを生成

```
./bin/rails generate mongoid:config
```

ActiveRecordとMongoDBを共存させたかったので、[こちらの記事](http://qiita.com/awakia/items/e1adf03bbd32dd8bfcf6)を参考にさせていただき設定しました。

* defaultのormがActiveRecordになるように修正

```config/application.rb
module StreamingSample
  class Application < Rails::Application
    config.generators do |g|
      g.orm :active_record
    end
  end
end
```

### Model作成

* tweet収集用のMongoモデル作成

```
./bin/rails g mongoid:model tweet_mongo
```

* Mongoモデルとしてロードするclassの設定

```config/mongoid.yml
development:
  options:
    preload_models:
      - tweet_mongo
```

* TweetMongoモデル更新

dataにstreaming apiから取得したtweetをそのまま入れることにします

```app/model/tweet_mongo.rb

class TweetMongo
  include Mongoid::Document
  field :data
end
```

### Tweet収集スクリプト修正

```script/twitter_streaming.rb
ENV["RAILS_ENV"] ||= "development"

root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
require File.join(root, "config", "environment")

daemon = TweetStream::Daemon.new('twitter_streaming',
                                 :log_output => false,
                                 :dir_mode => :script,
                                 :dir => File.join(Rails.root, 'tmp', 'pids'),
                                )

daemon.on_inited do
  ActiveRecord::Base.connection.disconnect!
  daemon_logger = Logger.new(File.join(Rails.root, "log", "stream.log"))
  Rails.logger = ActiveRecord::Base.logger = daemon_logger
  Rails.logger.debug "Listening..."
end
daemon.on_error do |message|
  Rails.logger.error message
end
daemon.track('#youtube') do |tweet|
  TweetMongo.create!(data: tweet.to_json) # MongoDBに保存する
end
```

### Controller作成

取得したTweetをjsonとしてそのまま返す簡単なAPIを作ってみます。

* api controller作成

```
./bin/rails g controller api::tweet
```

* routing設定

```config/routes.rb

StreamingSample::Application.routes.draw do
  namespace 'api', :module => 'api' do
    get    'tweet'       => 'tweet#index'
  end
end
```

* controller更新

```app/controllers/api/tweet_controller.rb
class Api::TweetController < ApplicationController
  def index
    tweets = TweetMongo.desc(:_id).limit(100).map {|tweet| JSON.parse(tweet.data)}
    render json: tweets
  end
end
```

### ブラウザからアクセスしてみる

[http://localhost:3000/api/tweet](http://localhost:3000/api/tweet)

これで最新順のTweetが最大100件表示されるAPIができました。

### 参考

* [Rails4でTwitterStreamingAPIを使う その2](http://blog.hello-world.jp.net/?p=843)
* [RailsでActiveRecordとMongoidの共存のさせ方](http://qiita.com/awakia/items/e1adf03bbd32dd8bfcf6)
* [GETTING STARTED RAILS 4 WITH MONGODB](http://moredevideas.wordpress.com/2013/04/26/rails-4-with-mongodb/)
* [Mongoid](http://mongoid.org/en/mongoid/)
* [Rails3 対応 MongoDB ORM、Mongoid 詳解―永続化](http://babie.hatenablog.com/entry/20100812/1281576103)
* [Rails: Store JSON in MongoDB](http://stackoverflow.com/questions/4058341/rails-store-json-in-mongodb)
* [MacにmongoDBをインストールする。そしてちょっと使ってみる。](http://nigohiroki.hatenablog.com/entry/2013/01/05/234631)
* [MongoDB のコマンド操作メモ](http://inokara.hateblo.jp/entry/2013/08/31/073336)
* [Daemons](http://daemons.rubyforge.org/classes/Daemons.html#M000004)
* [RubyでDemonizeするときのオプションとか使い方とか](http://takuya-1st.hatenablog.jp/entry/20110528/1306577311)
* [How to specify daemon's log and pid directories?](http://stackoverflow.com/questions/1560773/how-to-specify-daemons-log-and-pid-directories)