如何告诉 rails 不要在我的应用程序中预编译/缓存 .js.erb 文件?

Rah*_*hul 5 javascript ruby-on-rails precompile asset-pipeline actioncable

我的 app/assets/javascripts/channels 文件夹中有一个 messages.js.erb 文件,它应该生成代码以从数据库中获取每个聊天室并为该聊天室创建频道订阅。

这是我的 messages.js.erb 文件

//**app/assets/javascripts/channels/messages.js.erb**

$(document).on('turbolinks:load', function() {
  submitNewMessage();
});

<% Chatroom.all.each do |chatroom| %>
  App['room' + <%=chatroom.id%>] = App.cable.subscriptions.create({channel: 'MessagesChannel', room: <%=chatroom.id%>}, {
  received: function(data) {
   $("[data-chatroom='" + this.chatroomId + "']").removeClass('hidden');
    return $("[data-chatroom='" + this.chatroomId + "']").append(data.message);
  },

  setChatroomId: function(chatroomId) {
    this.chatroomId = chatroomId;
  }
});

<% end %>

function submitNewMessage(){
  //console.log(uid);
  $('textarea#message_content').keydown(function(event) {
    if (event.keyCode === 13) {
        var msg = event.target.value;
        var chatroomId = $("[data-chatroom]").data().chatroom;
        var uid = $('#uid').val();
        //console.log(uid);
        App['room' + chatroomId].setChatroomId(chatroomId);
        App['room' + chatroomId].send({message: msg, chatroom_id: chatroomId, user_id: uid});
        $('[data-textarea="message"]').val(" ");
        return false;
     }
  });
}
Run Code Online (Sandbox Code Playgroud)

最好,这个文件应该在每次创建新聊天室时重新加载,但 Rails在第一次加载后缓存(precompiling?)文件(asset?)并在每次请求时提供服务。

所以,问题是:每次创建一个新的聊天室时,如果我希望它流式传输(即,能够发布消息以立即流式传输给该聊天室的每个参与者),我需要手动更改文件(通过添加空格,或添加注释或日志记录到控制台,something) 并保存它,以便 rails 认为文件已更改并重新加载它,从而Chatroom再次迭代所有包含新创建的聊天室的s。

否则,当我在尚未流式传输的聊天室中发布(按 Enter)消息时(因为缓存版本看不到它),我会得到一个

未捕获的类型错误:无法读取 HTMLTextAreaElement 中未定义的属性“setChatroomId”。在HTMLTextAreaElement.dispatch(jQuery的1.11.3.min.self-ad66c584c2469d2bb527ba7aef5893549f1554ccc8ab3ccb43bd09ce8c3bf7a1.js体= 1〜5):(436?messages.self-cbf13df66ead12b7956faa24e880ce07c0289634216a096fafd4ac1c6d262f43.js体= 1)在HTMLTextAreaElement.r.handle(jquery的1.11 .3.min.self-ad66c584c2469d2bb527ba7aef5893549f1554ccc8ab3ccb43bd09ce8c3bf7a1.js?body=1:5)

在我的浏览器控制台(开发人员工具)中。错误的来源是:

这是生成的 messages.js 代码(为简洁起见,重复行被修剪)

  $(document).on('turbolinks:load', function() {
      submitNewMessage();
    });



   App['room' + 1] = App.cable.subscriptions.create({channel: 'MessagesChannel', room: 1}, {
  received: function(data) {
   $("[data-chatroom='" + this.chatroomId + "']").removeClass('hidden');
    return $("[data-chatroom='" + this.chatroomId + "']").append(data.message);
  },

  setChatroomId: function(chatroomId) {
    this.chatroomId = chatroomId;
  }
});
  .
  .
  .
  .
  .
  .
  .
  App['room' + 37] = App.cable.subscriptions.create({channel: 'MessagesChannel', room: 37}, {
  received: function(data) {
   $("[data-chatroom='" + this.chatroomId + "']").removeClass('hidden');
    return $("[data-chatroom='" + this.chatroomId + "']").append(data.message);
  },

  setChatroomId: function(chatroomId) {
    this.chatroomId = chatroomId;
  }
});


function submitNewMessage(){
  //console.log(uid);
  $('textarea#message_content').keydown(function(event) {
    if (event.keyCode === 13) {
        var msg = event.target.value;
        var chatroomId = $("[data-chatroom]").data().chatroom;
        var uid = $('#uid').val();
        App['room' + chatroomId].setChatroomId(chatroomId); // <-- line 436
        App['room' + chatroomId].send({message: msg, chatroom_id: chatroomId, user_id: uid});
        $('[data-textarea="message"]').val(" ");
        return false;
     }
  });
}
Run Code Online (Sandbox Code Playgroud)

我知道这个错误很明显,因为App['room' + 38]尚未为 id 为 38 的新聊天室定义,我们试图在其中发布消息(这里,所有 id 大于 37 的聊天室)

但是我如何让 rails 理解每次创建新聊天室时都需要重新加载这个文件。如果不是每次,那么在每个请求上?基本上,告诉 rails 不要预编译/缓存它,这样我就可以创建聊天室并随时随地从它们流式传输?

Mar*_*mic 1

messages.js.erb文件移动到lib/assetsvendor/assets目录。

来自文档

...lib/assets 或供应商/资产下的资产可通过应用程序清单包含在内,但不再是预编译数组的一部分。

确保它没有列在您的列表中application.js,您就可以开始了。