2010-02-16 6 views
1

J'ai un site très simple sinatra que je suis en train d'accéder via ajax par jQuery.jQuery se demande contre Sinatra ne reçoit pas de texte

Pour garder les choses incroyablement simple, cet extrait de code:

get '/behavior_count' do 
    "60" 
end 

qui retourne dans le navigateur « 60 », apparaît comme une chaîne vide lorsque vous tentez d'accéder au site via $.get en jQuery. La partie étrange est dans Firebug, tandis que la réponse est vide, l'en-tête HTTP décrit correctement Content-Length comme 2, et je peux voir la demande apparaître sur le serveur.

Y at-il quelque chose de spécifique à Sinatra qui ne retourne pas mes données, ou que je n'utilise pas correctement jQuery?

Si elle aide, j'ai aussi essayé ce code:

get '/behavior_count' do 
    content_type 'text/plain', :charset => 'utf-8' 
    "60" 
end 

et mon jQuery ressemble

$.get('http://mysite:4567/behavior_count'); // Ignore the response, but 
              // watch the request in firebug 

Toutes les idées?

+0

Je suppose que vous obtenez une réponse correcte lorsque vous pointez votre navigateur directement sur http: // mysite: 4567/behavior_count? –

+0

Oui, c'est la partie frustrante. – jerhinesmith

Répondre

2

Il ne s'agit probablement pas d'un problème d'interaction Sinatra/Jquery, mais d'un problème de "sécurité interdomaine" Ajax.

Votre problème d'origine pourrait être dû au fait que vous avez votre forme et votre serveur hébergé sur des domaines différents. XMLHttpRequests tels que .get, .post, .ajaxForm et .ajaxSubmit, échouera si elles sont sur des domaines différents. Vérifiez vos journaux sur l'application qui reçoit le message, et vous pouvez voir quelque chose comme "OPTIONS behavior_count" 404 dans le fichier journal. Fondamentalement, il fonctionnera lorsque vous frappez l'application directement, mais lorsque vous essayez d'utiliser AJax pour le faire, et que Ajax y accède à partir d'un domaine différent, c'est-à-dire, l'option "action" du formulaire contient "http://some.differentdomain.com/behavior_count".

Cela expliquerait pourquoi votre exemple simple fonctionne, parce que la forme et le poste se produisent sur la même application/même domaine.

J'ai eu le même problème pendant cinq heures tout à l'heure; Je voulais utiliser une application "commentaires" générique et avoir d'autres applications capables de poster sur l'application centrale, sur un domaine différent. Ça ne marchera pas. Mais ensuite j'ai fait les deux applications en une, et tout allait bien. Alternativement, vous pouvez essayer d'utiliser JSONP pour le faire fonctionner et garder les deux applications séparées. J'ai lu "jQuery $.ajax(), $.post sending “OPTIONS” as REQUEST_METHOD in Firefox", qui a aidé.

+0

Ça fait longtemps, mais je suis à peu près sûr que c'était le problème.C'était juste quelque chose avec lequel je jouais, et j'ai fini par l'abandonner, mais ça allait certainement dans plusieurs domaines. Je ne savais pas qu'Ajax ne le permettait pas. – jerhinesmith

+0

JSONP a été inventé pour contourner ce problème. Voir les notes sur http://api.jquery.com/jQuery.get/ Quelques informations supplémentaires ici http://en.wikipedia.org/wiki/Same_origin_policy – Eli

3

Jusqu'à ce que quelqu'un arrive avec une réponse correcte, voici l'exemple minimal j'ai essayé et cela fonctionne:

test.rb:

require 'rubygems' 
require 'sinatra' 

get '/' do 
    haml :test 
end 

get '/howmany' do 
    "42" 
end 

views/test.haml:

%html 
    %head 
    %script{:type => "text/javascript", :src => 'js/jquery.js'} 
    :javascript 
     $(document).ready(function() { 
     $('#btn').click(function(event){ 
      $.get('/howmany', function(data) { 
      $('#answer').html(data); 
      }); 
     }); 
     }); 
    %title Test page 

    %body 
    %input#btn{:type => 'button', :value => 'How many?'} 
    #answer 

(il y a aussi public/js/jquery.js, bien sûr)

Questions connexes