2009-11-10 5 views
1

J'essaie de récupérer des données JSON à partir d'un site distant avec Rails/Prototype. J'ai trouvé qu'il y a a branch of Prototype qui a une fonction Ajax.JSONRequest(). Je ne peux pas faire fonctionner ça. JQuery a une fonction $.getJSON(), mais j'utilise certaines fonctions Prototype et je préfère ne pas passer en jQuery ou utiliser aucun mode de conflit.JSONP avec Rails

Qu'est-ce qui me manque? Il semble que ce serait facile avec Rails ou Prototype.

+0

Je suis un peu confus. Vous mentionnez que vous voulez obtenir json avec Rails, mais que vous voulez utiliser JavaScript? Qui voulez-vous faire la demande - le serveur ou le client? –

+0

Je demande s'il y a un assistant Rails pour JSONP. Côté client ou côté serveur. Edited original post pour plus de clarté. – mculp

Répondre

1

Avez-vous besoin d'utiliser les assistants Rails pour que le client demande JSON? Il est facile avec Prototype

new Ajax.Request('/some_url', { method:'get', onSuccess: function(transport){ var json = transport.responseText.evalJSON(); } });

Vous devez juste vous assurer que/some_url répond avec JSON à un XHTTPRequest (de préférence en utilisant respond_to ?, mais vous pouvez également vérifier request.xhr?), À l'aide d'objets de Rails de # Méthode to_json

+0

Cela ne fonctionne pas avec les sites distants. – mculp

1

Rien n'est intégré aux rails spécifiquement pour jsonp, mais il y a quelques choses que vous pourriez faire si vous vouliez que votre application rails fonctionne bien avec jsonp.

  • créer un type MIME-jsonp dans config/initializers/mime_types.rb
  • étendre objet avec une méthode de to_jsonp qui envelopper les appels à JSON dans votre rappel passé. quelque chose comme:

def to_jsonp (rappel, options = {}) "# {} (rappel # {self.to_json (options)})" fin

  • suivre cet article gars.

http://blogs.sitepoint.com/2006/10/05/json-p-output-with-rails/

3

Vous pouvez également utiliser la middlware rack JSONP qui est disponible dans le rack-contrib. Cela vous donne la possibilité d'ajouter simplement la méthode callback = & à votre chaîne de requête et d'avoir la réponse des rails enveloppés dans votre méthode de rappel.

Il suffit de l'ajouter à votre application.rb:

require "rack/contrib/jsonp" 

class Application < Rails::Application 
    config.middleware.use Rack::JSONP 
end 
+3

Il y a une gemme pour ça maintenant, rack-jsonp qui fonctionne de la même façon; dans une application Rails 3.x, vous n'aurez pas besoin de 'require' et vous devrez juste ajouter' gem 'rack-jsonp'' à votre Gemfile et 'bundle install'. – cfeduke