我正在尝试从表单标记发送ajax请求,但是没有发送XHR请求。如果我从一个链接做同样的事情,一切都很完美。
以下是我可以从链接或表单发送请求的视图:
<div id="request_test">
<%= link_to "test", explorer_test_path(:format => :js), :remote => true %>
<%= form_tag explorer_test_path(:format => :js), :id => "testform", :remote => true, :method => :get do %>
<%= submit_tag "Send test request"%>
<% end %>
</div>
<div id="response_test"></div>
在我的控制器中,然后检查它是否是XHR请求,然后呈现响应ajax请求的javascript:
def test
if request.xhr?
logger.debug "xhr"
else
logger.debug "not xhr"
end
respond_to do |format|
format.js
end
end
我的test.js.erb非常简单:
$("#response_test").html("<b>hi</b>");
结果是,如果我点击链接,我会得到我正在寻找的行为,即response_test div读取“hi”。如果我提交表单,我只需将test.js.erb中的javascript写成字符串,服务器日志告诉我表单没有提交XHR请求。如果我在firebug中调试整个事情我得到相同的结果,链接发送一个ajax请求,提交的表单没有。在这两种情况下,我的控制台都告诉我服务器正在将请求作为JS处理,所以它不应该是任何数据类型的问题。
使用jquery UJS运行Rails 3.0.4。
感谢任何关于问题可能的提示,我已经尝试了很长一段时间,但由于我对Rails相对较新,我怀疑我遗漏了一些基本的东西。
更新:从(http://www.alfajango.com/blog/rails-jquery-ujs-now-interactive/)添加以下javascript修复了问题,这表明:remote =&gt; jquery ujs无法正确找到或解释我的表单标记上的true。我认为这是一个解决方法,而不是永久修复,所以如果有人知道我的原始代码有什么问题,我将非常感激。
$('#testform').live('submit', function(e) {
$.rails.handleRemote( $(this) );
e.preventDefault();
});