[技術書つまみ食い] 『MongoDB イン・アクション』第四回

[技術書つまみ食い] 『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_archive

とりあえずまとめ

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

カテゴリー: 技術書つまみ食い パーマリンク

[技術書つまみ食い] 『MongoDB イン・アクション』第四回 への1件のコメント

  1. ピンバック: [技術書つまみ食い] 『MongoDB イン・アクション』第五回 | UPEC Blog

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください