[技術書つまみ食い] 『MongoDB イン・アクション』第三回 の続きです。
3章 MongoDB を使ったプログラムの作成
前回は TwitterAPI の検索結果を MongoDB へ格納するところまでをやりました。
今回は格納されているデータを使って Web 画面に Tweet の内容を表示させます。
ハマったので fix
まぁ、ハマったって程では無いですが、やっぱり TwitterAPI の最新の仕様への対応は必要ですね。erb の一部に修正が必要でした。
当該箇所(p63)のサンプルコードは下記の通り。
<body>
<h1>Tweet Archive</h1>
<% TAGS.each do |tag|%>
<a href="/?tag=<%= tag %>"><%= tag %></a>
<% end %>
<% @tweets.each do |tweet| %>
<h2><%= tweet['text'] %></h2>
<p>
<a href="http://twitter.com/<%= tweet['from_user'] %>">
<%= tweet['from_user'] %>
</a> on <%= tweet['created_at'] %>
</p>
<img src="<%= tweet['profile_image_url'] %>" width="48" />
<% end %>
</body>
現行の TwitterAPI のレスポンスには from_user とかが無いので、実際に格納されているデータの構造を javascript シェルで覗いて、対応するように修正しました。
修正版は下記の通り。
<body>
<h1>Tweet Archive</h1>
<% TAGS.each do |tag|%>
<a href="/?tag=<%= tag %>"><%= tag %></a>
<% end %>
<% @tweets.each do |tweet| %>
<h2><%= tweet['text'] %></h2>
<p>
# <a href="http://twitter.com/<%= tweet['from_user'] %>">
<a href="http://twitter.com/<%= tweet['user']['screen_name'] %>">
# <%= tweet['from_user'] %>
<%= tweet['user']['screen_name'] %>
</a> on <%= tweet['created_at'] %>
</p>
# <img src="<%= tweet['profile_image_url'] %>" width="48" />
<img src="<%= tweet['user']['profile_image_url'] %>" width="48" />
<% end %>
</body>
動作結果
sinatra サーバーを立ち上げてアクセスしたら、ちゃんと動いている事が確認できました。

とりあえずまとめ
Twitter みたいに、レスポンスのデータ構造がコロコロ変わるようなサービスと接続するアプリケーションを作るにあたって「とりあえずレスポンスを丸々保存しておいて、使うときに調整する」みたいなアプローチは超強力と言わざるを得ないですね。スキーマレスって、アタマでは理解していたつもりだったけど、思っていた以上に楽だって事が分かりました。
ココまでで第1部がおしまい。次から第2部4章です。これまでとは違って、少し複雑なアプリケーションを作るようなので、書いたソースは随時 github にプッシュしながら進めていこうかと思います。
以上!
ピンバック: [技術書つまみ食い] 『MongoDB イン・アクション』第五回 | UPEC Blog