我有一个非常简单的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
有什么想法吗?
答案 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”,这有帮助。