XHR作为字符串而不是从rails控制器返回的对象

时间:2017-10-17 21:51:25

标签: javascript ruby-on-rails ruby

[EDIT已解决]我解决了这个问题,这是一个与远程宝石有关的问题。我使用了以下链接:https://github.com/JangoSteve/remotipart/issues/77#issuecomment-20843889

我的控制器中有这部分代码:

    if @contract.update_attributes(contract_params)
      Rails.logger.info("Contratto aggiornato con successo")
      respond_to do |format|
        format.js {render partial: 'contracts/success', status: 200}
      end
    else
      @errors=@contract.errors

      respond_to do |format|
        # format.js { render 'strutturas/edit' }
        format.js {render partial: '/pages/shared/form_error', status: :unprocessable_entity, :locals => { :errors => @errors }}
      end

      Rails.logger.error("Problema nel salvataggio del contratto")
    end

这是javascript:

$(document).on('ajax:error', '#upload_contract', function(evt, xhr, status, error) {
    $("#form_error").html(xhr.responseText);
    console.log("Errore");
    console.log(xhr);
});


$(document).on('ajax:success', '#upload_contract', function(evt, xhr, status, error){
    $("#contract_space").html(xhr.responseText);
    console.log(xhr);
    console.log(evt);
});

如果update_attributes失败没问题,javascript将xhr作为对象,我可以使用xhr.responseText显示消息。

我不明白为什么在ajax成功的情况下xhr是一个字符串而不是一个对象所以xhr.responseText是未定义的。

对我而言,这两种情况是相同的,无法理解为什么他们在做不同的事情。

问题显然是在成功的情况下,因为错误案例正在发挥作用。

这是xhr的对数(应该是一个对象):

<head><script type="text/javascript">try{window.parent.document;}catch(err){document.domain=document.domain;}</script> </head><body><textarea data-type="text/javascript" data-status="200" data-statustext="OK">&lt;div class='col-md-10 col-md-offset-1'&gt;
  &lt;div class='spacer30'&gt;&lt;/div&gt;
  &lt;div class='alert alert-success'&gt;
    &lt;strong&gt;
      Il contratto è stato caricato con successo. I nostri operatori invieranno via email le credenziali di accesso una volta verificato il documento allegato. Per qualsiasi dubbio può contattare l'assistenza SHB via email:
      &lt;a href='mailto:info@shbooking.com'&gt;info@shbooking.com&lt;/a&gt;
    &lt;/strong&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;spacer50&gt;&lt;/spacer50&gt;
</textarea></body>

1 个答案:

答案 0 :(得分:0)

你希望$(document).on('ajax:success', '#upload_contract', function(evt, data, status, xhr){ $("#contract_space").html(data); console.log(data); console.log(evt); }); 看起来更像:

data

其中Device.OpenUri(new Uri("tel:528331607211"));将是呈现部分的HTML。