【问题标题】:Rails 4-- coffeescript not executing in partialRails 4 - 咖啡脚本未部分执行
【发布时间】:2014-08-04 06:15:29
【问题描述】:

我有一个显示运动队的视图。当您单击一个团队时,一个信息选项卡会通过 ajax 填充时间表、花名册等,它会调用控制器来处理对外部 API 或本地数据库的调用(取决于要显示的数据)。然后,ajax 通过一个咖啡脚本文件使用返回的数据呈现一个部分。

到目前为止,一切都很好——但是咖啡脚本中返回的部分永远不会被执行。您可以在此处看到一个带有部分返回的确切 js 的 jsfiddle:http://jsfiddle.net/43XAQ/1/

coffeescript 文件如下所示:

$(document).ready -> // same issue with or without the document.ready
  <% @poll.each do |p| %>
    $ = jQuery; // tried with and without this line-- no change
    $('#poll_body').append("<%= j render(partial: 'poll/place', locals: { place: p }) %>")
  <% end %>

它正在加载的视图有一个简单的表格,就像上面的小提琴一样。

我认为是 turbolinks 造成的,因为我在其他 js 元素上也遇到过这个问题——但我安装了jquery-turbolinks gem,它解决了其他问题,但没有解决这个问题。完全相同的代码在 jsfiddle 中效果很好,但在我的本地站点中却不行。所以我认为这与 Rails 如何加载 js 有关?

编辑:是的,我使用开发工具查看返回的内容。抱歉,如果不清楚 - 这正是我在上面链接的小提琴中粘贴为 js 组件的内容:

    (function() {
        var $;
        $ = jQuery;
        return $('#poll_body').append("<tr>\n   <td>10<\/td>\n  <td><a href=\"/team/236\">Oklahoma State Cowboys<\/a><\/td>\n   <td>AP Poll<\/td>\n <td>3<\/td>\n <\/tr>");
      });

    }).call(this);

编辑2:

还有几点:

1) 如果我在 coffescript 文件中除了警报或控制台日志之外什么都不做,它仍然什么都不做。

2) 对调用咖啡脚本的控制器的实际调用是一个标准的 jQuery click 事件。在投票视图中加载了一个polls.js 文件,它执行以下操作:

$( document ).ready(function() {
  $('#poll').on('click', '.poll-item', function(){  
    doActive(this);
    current_team = this.id;
  });
});

// snip //
var doActive = function(el){
    // some other stuff
    getNews(current_team); // calls a webservice via ajax, works fine.
    getRoster(current_team); // calls a webservice via ajax, works fine.
    getPolls(current_team);  // calls the controller via ajax, returns coffeescript properly, coffeescript never gets executed    
}

【问题讨论】:

  • 你有没有使用开发者工具直接查看返回的内容?
  • 因为它是一个 ajax 调用,因此您应该查看开发人员控制台是否调用了 ajax 请求,如果它被调用,那么是否有任何错误?如果没有任何错误,请在您的咖啡脚本文件中尝试一个简单的警报
  • 删除你的document.ready。这不是必需的。如果出现错误,通常 JS 不会执行。检查您使用的选择器是否正确。还要在 JS 行的末尾加上分号。它应该工作。尝试输入 alert() 来检查它是否工作
  • @noel——是的,我使用了开发者工具。请在上面查看我的编辑。
  • @Aravind——我添加了分号和警告。控制台或日志中没有报告错误,但行为没有变化。什么都没有。

标签: jquery ruby-on-rails ruby-on-rails-4 coffeescript


【解决方案1】:

如果是 AJAX 响应,则不需要 $(document).ready()。页面首次加载时会触发它,但我相信每次收到响应时都不会再次触发它。

【讨论】:

  • 您能否与我们分享您当时是如何向服务器发出请求的?
  • @bratsche——当然——你想看什么?
  • 正是我所要求的。你是如何提出请求的。比如,它是一个link_to 吗?它是在某处发生的 $.ajax 吗?你能分享这个(连同你传递给他们的参数)吗?我之所以问,是因为我的应用程序中有很多地方正在返回 .js.erb 文件,它们会在收到响应时执行。为了好玩,我之前在其中一个中添加了 $(document).ready() 以查看是否会破坏它,并且确实如此,这就是为什么我建议您删除它的原因。但由于它没有解决您的问题,我猜您提出请求的方式可能有些问题。
  • 我明白你在说什么。正如它在问题中所说,它是通过点击激活的。所以有一个元素(基本上是按钮)是团队名称。当您单击团队时,会触发一个事件以填充一些信息选项卡。 “纯” js 选项卡可以很好地填充。调用控制器将数据返回给 js.erb 的那个会返回正确的响应——但它从不做任何事情。
  • 您能分享实际的 link_to() 或 button_to() 或您用来生成链接的任何内容吗?
【解决方案2】:

令人难以置信,但显然问题在于调用控制器操作的 jQuery ajax 函数默认为 dataType: 'json' - 这使得一切都按设计工作,但由于数据(可能)被返回为 @987654323 @ 而不是 js,coffeescript 没有被解雇。

我重写了所有 js 操作,因为我已经完成了我能想到的所有其他操作,而且这似乎已经解决了它。

感谢大家的想法和帮助。

【讨论】:

    【解决方案3】:

    Turbolinks

    问题可能出在turbolinks,因为您尝试使用$(document).ready 渲染anonymous function,而typically fails with turbolinks

    我不知道这是否是实际问题,但您可能希望让您的代码更“对涡轮链接友好”:

    #-> I hope you have `.erb`appended to this file - otherwise @polls won't owrk
    
    polls ->
      <% @poll.each do |p| %>
        $ = jQuery; // tried with and without this line-- no change
        $('#poll_body').append("<%= j render(partial: 'poll/place', locals: { place: p }) %>")
      <% end %>
    
    $(document).on "page:load ready", polls
    

    编辑 - 我刚刚读到您认为问题出在 Turbolinks 上,您可能希望忽略我上面的建议(尽管我会留下它们的想法)

    【讨论】:

    • @RichPeck--谢谢--我试过你发布的代码,它“工作”,因为它不会抛出任何错误,但 js 代码永远不会被执行,和我的一样原来的问题!看起来很奇怪,因为代码在使用常规页面时正确执行,例如。在 jsfiddle 中。
    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2014-12-12
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多