jQuery得到针对Sinatra的请求没有得到文本

时间:2010-02-16 19:03:03

标签: jquery ruby ajax sinatra

我有一个非常简单的sinatra网站,我试图通过jQuery通过ajax访问。

为了让事情变得异常简单,这段代码如下:

get '/behavior_count' do
  "60"
end

在浏览器中返回“60”,在尝试通过jQuery中的$.get访问网站时显示为空字符串。奇怪的部分在Firebug中,而Response为空,HTTP标头正确地将Content-Length描述为2,我可以看到请求显示在服务器上。

Sinatra是否有特定的东西没有返回我的数据,或者我没有正确使用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 个答案:

答案 0 :(得分:3)

在有人提出正确答案之前,这是我尝试过的最小例子,它起作用了:

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

(当然还有public/js/jquery.js

答案 1 :(得分:2)

这可能不是Sinatra / Jquery交互问题,相反,它是一个Ajax“跨域安全”问题。

您的原始问题可能是由于您已将表单和服务器托管在不同的域上。如果.get.post.ajaxForm.ajaxSubmit等XMLHTTP请求位于不同的域上,则会失败。检查收到帖子的应用程序上的日志,您可能会在日志文件中看到类似"OPTIONS behavior_count" 404的内容。基本上,它会在您直接点击应用程序时起作用,但是当您尝试使用AJax执行此操作时,Ajax正在从其他域访问它,即表单上的“action”选项具有"http://some.differentdomain.com/behavior_count"在它。

这可以解释为什么您的简单示例有效,因为表单和帖子发生在同一个应用程序/同一个域中。

我刚才有五个小时遇到同样的问题;我想使用通用的“评论”应用程序,并让其他应用程序能够发布到不同域上的一个中央应用程序。它不会起作用。但后来我将两个应用程序合二为一,一切都很好。或者,您可以尝试使用JSONP使其工作,并仍然将两个应用程序分开。

我读了“jQuery $.ajax(), $.post sending “OPTIONS” as REQUEST_METHOD in Firefox”,这有帮助。