【问题标题】:Rails render partial Ajax Error BUT correct response shown in DebuggerRails 呈现部分 Ajax 错误,但在调试器中显示正确的响应
【发布时间】:2013-02-21 11:46:00
【问题描述】:

我正在尝试使用不显眼的 Javascript 在现有链接上触发附加 ajax 查询。

查询将发送到服务器并进行处理,返回字符串“javascript template ok”进行测试。

但是,永远不会调用 ajax“成功”函数。到位,就是触发了“错误”功能……

我查看了 Chrome 调试器,可以看到从服务器返回的响应文本,但从来没有调用过“成功”方法... :-(

我的电话是

jQuery.ajax({
    type: 'POST',

    success: function(response) {   
        $("#details").html(response);
        console.log(response);
    },
    error: function(){ 
        alert("Error\nData could not be retrieve from the server");
    },
    url: '/treeview/show/1538.js',
    cache: false,
});

(在此示例中,url 是硬编码的)。浏览器中的相同 Url 无需布局即可获得正确的数据 :-)

去掉url中的“.js”返回带有布局的html模板,正确实现“details”div的更新...

控制器是

    respond_to do |format|
      format.html # show.html.erb
      format.js   { render :inline => "JAVASCRIPT TEMPLATE !" }
    end

谢谢

编辑:

这里是ajax查询返回的对象(错误的第一个参数:function(jqXHR)):

Object
    abort: function ( statusText ) {
    always: function () {
    complete: function () {
    done: function () {
    error: function () {
    fail: function () {
    getAllResponseHeaders: function () {
    getResponseHeader: function ( key ) {
    overrideMimeType: function ( type ) {
    pipe: function ( /* fnDone, fnFail, fnProgress */ ) {
    progress: function () {
    promise: function ( obj ) {
    readyState: 4
    responseText: "JAVASCRIPT TEMPLATE !"
    setRequestHeader: function ( name, value ) {
    state: function () {
    status: 200
    statusCode: function ( map ) {
    statusText: "OK"
    success: function () {
    then: function ( /* fnDone, fnFail, fnProgress */ ) {
    __proto__: Object

所以我得到了正确的响应文本??!!那么错误可能在哪里? :-s

【问题讨论】:

  • 您是否尝试过传递dataType: 'script' 并创建js.erb 模板而不是内联渲染?
  • @Stephane:已经有很多答案似乎指向正确的方向 afaik。然而你对他们中的任何一个都没有反应?那我们可以怎样帮助你呢?请帮助我们为您提供帮助。

标签: javascript ruby-on-rails ajax


【解决方案1】:

这是你应该做的:

$.post('/treeview/show/1538.js', function(response, data){
  $("#details").html(data.responseText);
}).error(function(){
  alert("Error\nData could not be retrieve from the server");
})

在你的控制器中是可选的

respond_to do |format|
  format.html # show.html.erb
  format.js   { render text: "JAVASCRIPT TEMPLATE !" }
end

试试看。

【讨论】:

    【解决方案2】:

    编辑您的错误调用以将错误数据传递给 DOM:

    error: function(data){ console.log(data); }
    

    然后你会看到到底发生了什么。

    【讨论】:

      【解决方案3】:

      您没有为jQuery.ajax 显式指定dataType 选项,因此jQuery 将其推断为script(依赖于Rails 提供的MIME 类型)。由于JAVASCRIPT TEMPLATE ! 不是有效的Javascript 语句,因此会引发解析器错误。有两个选项可以调用 success 回调而不是 error

      dataType 明确指定为text

      jQuery.ajax({
          type: 'POST',
          dataType: 'text',
          // ...
      });
      

      或从控制器返回有效的 Javascript:

      respond_to do |format|
        format.html # show.html.erb
        format.js { render :inline => "{}" }
      end
      

      【讨论】:

        【解决方案4】:

        到您的 ajax 调用中,添加

        dataType: 'json',
        

        还有,控制器

        format.js   render :text => { :some_data => "JAVASCRIPT TEMPLATE !" }.to_json
        

        【讨论】:

          【解决方案5】:

          您是否考虑过响应可能会被评估为 javascript 代码并因此引发被捕获的错误?

          【讨论】:

            【解决方案6】:

            好的,我不确定这个,但也许其中之一会有所帮助:

            使用done()fail() 代替错误/成功。像这样:

            $.ajax({ ...}).done(...).fail(...);
            

            尝试在成功/错误回调中使用正确的函数参数。也许 jQuery 不喜欢签名,因此不调用函数?

            【讨论】:

            • “成功”是正确的。 “错误”是 1.8 之前的方式,已被“失败”取代。 “完成”是做“完成”事情的新方式。 “完成”与“成功”不同,因为无论调用结果如何,它都会触发。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-14
            • 2018-03-18
            • 1970-01-01
            • 2015-07-24
            • 2018-02-23
            • 2013-07-05
            相关资源
            最近更新 更多