JQuery получить запрос против Синатры не получает текст - PullRequest
1 голос
/ 16 февраля 2010

У меня есть очень простой сайт sinatra, к которому я пытаюсь получить доступ через ajax через jQuery.

Чтобы все было невероятно просто, этот фрагмент кода:

get '/behavior_count' do
  "60"
end

, который возвращает «60» в браузере, отображается как пустая строка при попытке доступа к сайту через $.get в jQuery. Странная часть в Firebug, хотя Response пуст, HTTP-заголовок правильно описывает Content-Length как 2, и я вижу, как запрос отображается на сервере.

Есть ли что-то специфическое для Синатры, которое не возвращает мои данные, или я не правильно использую jQuery?

Если это поможет, я также попробовал этот код:

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

и мой jQuery выглядит как

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

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Пока кто-нибудь не придет к правильному ответу, вот минимальный пример, который я пробовал, и он работает:

test.rb * * 1004

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

(есть также public/js/jquery.js, конечно)

2 голосов
/ 20 марта 2010

Вероятно, это не проблема взаимодействия Sinatra / Jquery, а проблема Ajax "междоменная безопасность".

Ваша первоначальная проблема может быть связана с тем, что ваша форма и сервер размещены в разных доменах. Запросы XMLHTTP, такие как .get, .post, .ajaxForm и .ajaxSubmit, не будут выполнены, если они находятся в разных доменах. Проверьте свои журналы в приложении, которое получает сообщение, и вы можете увидеть что-то вроде "OPTIONS behavior_count" 404 в файле журнала. По сути, это будет работать, когда вы напрямую нажимаете на приложение, но когда вы пытаетесь использовать AJax для этого, и когда Ajax обращается к нему из другого домена, то есть опция «action» в форме содержит "http://some.differentdomain.com/behavior_count" в нем .

Это объясняет, почему ваш простой пример работает, потому что форма и публикация происходят в одном приложении / одном домене.

У меня была такая же проблема в течение пяти часов только сейчас; Я хотел использовать универсальное приложение «комментарии», чтобы другие приложения могли отправлять сообщения в одно центральное приложение в другом домене. Это не сработает. Но потом я превратил два приложения в одно, и все было хорошо. Кроме того, вы можете попытаться использовать JSONP, чтобы заставить его работать, и при этом держать два приложения отдельно.

Я прочитал « jQuery $ .ajax (), $ .post, отправляющий« OPTIONS »как REQUEST_METHOD в Firefox », что помогло.

...