1

看一下这个。我有一个相当简单的表单,它使用以下语法创建:

<%= 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总是让我感到困惑。

4

1 回答 1

3

将 js 响应模板设置为new.js.erb不正确。

new.html.erb按照惯例,表单本身在模板中。所以,表单的动作应该指向#create.

为了正确响应此表单的提交,您需要创建一个 js 模板create.js.erb,并在操作中响应 js #create

此外,在大多数情况下,您不需要在资产 js 中手动设置 Ajax 响应,例如

$('#new_issue_order').on('ajax:success', issueOrder.processOrder)...

相反,您可以在create.js.erb. 例如

$('#new_issue_order').css('background', 'green')

此脚本将在ajax:success事件之后运行。

于 2013-11-11T05:24:09.727 回答