Rails 4-- coffeescript没有部分执行

时间:2014-06-13 15:59:13

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

我有一个能够展示运动队的观点。当您单击一个团队时,信息选项卡会通过ajax填充计划,名单等,该控制器会调用控制器来处理对外部API或本地数据库的调用(取决于要显示的数据)。然后ajax通过coffeescript文件使用返回的数据呈现部分。

到目前为止,它的工作效果都很好 - 但是咖啡因中返回的部分内容从未被执行过。您可以在这里看到一个jsfiddle,其中包含部分返回的确切js: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);

EDIT2:

还有几点:

1)如果我在coffescript文件中没有做任何事情,除了警报或控制台日志,它仍然没有做任何事情。

2)对调用coffeescript的控制器的实际调用是标准的jQuery单击事件。在poll视图中加载了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    
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

我重写了所有js行动,因为我已经完成了我能想到的所有其他事情,而且似乎已经解决了这个问题。

感谢大家的想法和帮助。

答案 2 :(得分:0)

<强> Turbolinks

问题可能在于turbolinks,因为您尝试使用$(document).ready呈现anonymous functiontypically 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上,你可能希望忽略我上面的建议(虽然我会留下他们的想法)