检查一下。我有一个相当简单的表单,使用以下语法创建:
<%= form_for([@issue, @issue_order], :remote => true) do |f| %>
由于页面上的逻辑,表单实际上是通过javascript调用的,如下所示:
$('#new_issue_order')[0].submit()
控制器通过执行一些逻辑来处理ajax请求,然后抛出一些这样的东西:
respond_to do |format|
format.js
end
处理此响应的AJAX位于以下javascript:
$('#new_issue_order').on('ajax:success', issueOrder.processOrder)
..........
processOrder: function(e, data, status, xhr) {
$('.sign-up-errors').empty();
errors = xhr.getResponseHeader('X-Flash-Error').split(',');
for (i=0; i < errors.length; i++) {
$('.errors').append($('<p>' + errors[i] + '</p>'));
}
setTimeout(function() {
$('.errors').empty();
}, 3500);·
}
我认为这会允许它响应远程请求,但我得到的是以下错误:
ActionController::UnknownFormat
我尝试在我的视图中创建一个new.js.erb(与它所在的新页面对应),但我仍然遇到同样的错误。我没有尝试将我的成功处理程序AJAX迁移到new.js.erb代码,因为出于商业原因,我宁愿将javascript处理保存在我的资产的javascript文件中。
如何获得无缝的AJAX响应?我以前做过,但是respond_to一直困惑我。
答案 0 :(得分:3)
将js响应模板设置为new.js.erb
不正确。
表单本身在new.html.erb
模板中,按惯例猜测。因此,表单的操作应该指向#create
。
为了正确回复此表单的提交,您需要创建一个js模板create.js.erb
,并在#create
操作中回复js。
此外,在大多数情况下,您不需要在资产js中手动设置Ajax响应,如
$('#new_issue_order').on('ajax:success', issueOrder.processOrder)...
相反,您可以在create.js.erb
内完成。例如
$('#new_issue_order').css('background', 'green')
此脚本将在ajax:success
事件后运行。