2010-11-30 33 views
1

Je veux interroger de manière asynchrone l'API Foursquare, qui ne permet pas actuellement l'ancien $ .get(). Ma solution à court terme est de faire une aide qui reçoit uniquement les données comme ceci:Créer un proxy Rails pour JSON

def foursquare_info_for(venue_id) 
    res = Net::HTTP.get_response("api.foursquare.com", "/v1/venue.json?vid=#{venue_id}") 
    data = JSON.parse(res.body) 
    info = Hash.new 
    info["mayor_name"] = "#{data['venue']['stats']['mayor']['user']['firstname']} #{data['venue']['stats']['mayor']['user']['lastname']}" 
    info["mayor_photo_src"] = "#{data['venue']['stats']['mayor']['user']['photo']}" 
    info["checkins"] = "#{data['venue']['stats']['checkins']}" 
    info 
end 

Cela fonctionne, mais je préfère en faire une procuration que je peux obtenir à une demande jQuery AJAX après le chargement de la page pour accélérer les choses un peu. Je suis sûr que cette aide est proche de ce que j'ai besoin de faire pour que le proxy marche, mais je ne suis pas sûr d'où j'ai besoin de mettre le proxy JSON de mon côté pour pouvoir l'attraper avec jQuery. Je suis sur la bonne voie pour créer le proxy avec net/http?

Où puis-je mettre le proxy de mon côté afin que je puisse y accéder avec un jQuery GET?

Répondre

5

Je pense que Net :: HTTP est assez bon pour cela.

Je ferais un cours pour ça. Quelque chose comme:

class FoursquareInfo < Struct.new(:venue_id) 

    def info 
    { :mayor_name => mayour_name, :mayor_photo_src => mayor_photo_src, :checkins => checkins } 
    end 

    def mayor_name 
    "#{mayor_firstname} #{mayor_lastname}" 
    end 

    def mayor_firstname 
    mayor["firstname"] 
    end 

    def mayor 
    stats["mayor"]["user"] 
    end 

    def stats 
    data["venue"]["stats"] 
    end 

    def data 
    @data ||= JSON.parse(response.body) 
    end 

    def response 
    Net::HTTP.get_response("api.foursquare.com", "/v1/venue.json?vid=#{venue_id}") 
    end 

    # etc... 

end 

Et d'un contrôleur:

class FoursquareInfosController < ApplicationController 
    def show 
    render :json => FoursquareInfo.new(params[:id]).info 
    end 
end 
+0

Merci! Cela a fonctionné comme un charme. – mcmaloney

+0

Merci aussi cherchait quelque chose de similaire –