Rails 5.1.4升级后的Ajax问题

时间:2017-12-09 16:06:51

标签: ruby-on-rails rails-ujs

在我的account.js.coffee上,我看看是否调用了Ajax事件。

$(document).on 'ajax:success', 'form', (event) ->
 console.log 'success'

$(document).on 'ajax:error', 'form', (event) ->
 console.log 'error'
class AccountsController < ApplicationController
 def update
    respond_to do |format|
       if @account.update(home_params)
            format.html { redirect_to @account, notice: 'Home was successfully updated.' }
            format.json { render :show, status: :ok, location: @account }
            format.js
        else
            format.html { render :edit }
            format.json { render json: @account.errors, status: :unprocessable_entity }
            format.js
        end
    end
 end

当我远程提交表单时,应该触发Ajax事件,如果有错误应该触发Ajax错误,或者当对象被更新时触发Ajax:success;但是当表单上存在错误时触发Ajax成功(当属性必须存在时为空属性),并且当对象成功更新时,不会触发Ajax。表单有remote:true属性,在application.js.coffee上我有jQuery,rails-ujs。我收到ajax:error事件的唯一一次是我故意从update.js.erb页面擦除对象,看看是否触发了Ajax:错误。 当rails在4.2上时(更新前),一切正常工作:(

这是我在控制台上收到的表格上的错误时发生的事件。 CustomEvent {isTrusted:false,detail:Array,initCustomEvent:function,type:&#34; ajax:success&#34;,target:,...}

update.js.erb

<% if @account.errors.any? %>
    <!-- Show errors in to the modal view -->
    <%= render :partial=>'layouts/js_errors', :locals=> { :target=> @account } %>

    <!-- Sending error alert -->
    $('#flash-alerts').html("<div class=\"alert alert-danger\" role=\"alert\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\"><i class=\"ace-icon fa fa-times\"></i></button><i class=\"ace-icon fa fa-check green\"></i>Something went wrong, please try again later</div>");
   timeOutAlert();
<% else %> 
   <!-- hidden the modals -->
   $('#myModal').modal('hide');
   $('#myModal .modal-title').html('');
   $('#myModal .modal-body').html('');

   <!-- Update The title of the accounts/_title from show.html.haml -->
   $('.page-header h1').html("<%= j render partial: 'title', locals:{account: @account} %>");

   <!-- Update the account block -->
   $('#account').html("<%= j render @account %>");

   <!-- Sending successfully alert -->
   $('#flash-alerts').html("<div class=\"alert alert-success\" role=\"alert\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\"><i class=\"ace-icon fa fa-times\"></i></button><i class=\"ace-icon fa fa-check green\"></i> Account was successfully updated.</div>");
   timeOutAlert();
<% end %>

到目前为止,我发现如果你在一个bootstrap(版本3)模式中插入表单,那么当你点击提交表单(remote:true)并且它成功时,那么ajax:success callback赢了&#39触发。如果对象因为错误而回滚(属性不能为空),那么ajax:成功它就会触发。当我使用accounts / edit.html.haml上的表单时,我的Jquery验证是触发器,并且当对象更新时也会触发ajax:success。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

根据文档,Rails 5.1引入rails-ujs并删除jQuery作为依赖项,这可能会有所帮助。因此,此引入会导致对请求期间触发的自定义事件的更改,请参阅:3.5 Rails-ujs event handlers (edge)

根据 jquery-ujs wiki ajax:error仅被触发:

  

在服务器上处理请求失败时   https://github.com/rails/jquery-ujs/wiki/ajax

这就是为什么即使表单有验证错误,也总是得到ajax:success