RubyはFlickrが大好き

ボタンクリックをRubyにフックする方法は分かったので,Flickrと話して検索結果のデータを取得するようにしよう。まず最初に,Flickrとの通信方法を知る必要がある。initializeを以下のように変える。

def initialize 
  @url = "http://api.flickr.com/services/rest" 
  @options = { 
    :method => "flickr.photos.search", 
    :format => "json", 
    :nojsoncallback => "1", 
    :api_key => "6dba7971b2abf352b9dcd48a2e5a5921", 
    :sort => "relevance", 
    :per_page => "30" 
  } 
  document.submit_search.onclick do |s, e| 
    create(document.keyword.value, 1) 
  end 
end 

我々は分別のある大人なので,FlickrとはRESTで通信する。@optionsハッシュは,RESTの呼び出しに必要な様々なパーツを集めたものだ。我々は後でこれをURLにする関数を作る。重要なのは,我々がflickr.photos.searchを呼び出し,レスポンスとしてJSONを要求するということだ。onclickイベントは,神秘的な名前のcreateメソッドを呼び出す。これはまだ存在していないので,書くことにする。

def create(keyword, page) 
  @options[:tags] = keyword 
  @options[:page] = page 
  request 
end 

def request 
  make_url 
  request = Net::WebClient.new 
  request.download_string_completed do |sender, args| 
    @response = args.result 
    show 
  end 
  document.images_loading.style[:display] = "inline" 
  request.download_string_async Uri.new(@url) 
end 

createは再利用する必要がありそうだし,その引数はURIの一部としても必要なので,initializeの中で作った@optionsに追加しておく。そしてrequestメソッドを呼び出す。ここで「会話」が始まる。

最初に,@optionsからURLを作る(メソッドはすぐ作る)。そしてSystem::Windows::Net::WebClient(Silverlightの一部)のインスタンスに対して,Flickrに実際にリクエストを出すように通知している。images_loading.style[:display] = "inline" で,ロード中のインジケータが回り始める。レスポンスが帰ってきたら,showを呼び出す。これはなんか表示すべきだろうね。とりあえずレスポンスを出力して,ロード中インジケータを止める。

def show 
  puts @response 
  document.images_loading.style[:display] = "none" 
end

おっと。make_urlを作るちょうどいい頃合いだ。

def make_url 
  first, separator = true, '?' 
  @options.each do |key, value| 
    separator = "&" unless first 
    @url += "#{separator}#{key}=#{value}" 
    first = false 
  end 
end 

特別なことは何も無くて,"?"と"&"と"="を正しい場所におくだけだ。まだこれだけじゃ動作しない。app.rbを保存して,検索文字を入力して,searchをクリックすると,わけの分からないものが表示される。