Rails 即使被注释掉也呈现局部

Rails rendering partials even when commented out

我很好奇 Rails 5 是如何渲染局部图像的,以及是否存在我不知道的陷阱。我的页面上有两个部分,一个作为 html 的一部分呈现,另一个在 ajax 请求的成功回调中呈现。但是,当我刷新页面时,ajax 请求中的部分实际上正在呈现,即使 ajax 请求没有被触发,甚至当渲染部分的调用被注释掉时。

我一直假设在代码行 运行 时局部渲染。

相关代码如下:

$('body').on("click", ".notif-popup-container", function() {

  $.post(
    "/notifications/read",
    { notif_id: notifId },
  ).done(function(data) {
    $('#notifUnreadCount').html(data.unread_notifs);
    
    var popover = $('#notificationsBell').data('bs.popover');
    popover.config.content = $('.notifications-list').html();
  })


  $('.notifications-list').html("<%= j (render partial: 'notifications/partials/test_partial') %>"); // this never fails to render, even when commented out

})
<div style="display:none" class="notifications-list">
  <%= render 'notifications/partials/popover_notifications' %>
</div>

这是控制台输出图像。如您所见,_popover_notifications.html.erb 按应有的方式呈现,但随后我的 _test_partial.html.erb 也呈现,但它不应该呈现,因为它所在的点击处理程序未被触发。

任何见解表示赞赏。

I had always assumed that partials render at the time the line of code is run.

这里的关键是理解什么时候代码是运行。当您使用 js.erb 动态创建 javascript 时,文件首先 运行 通过服务器上的 ERB,然后再发送到 运行 生成的 javascript 客户端.您的服务器实际上并不解析 javascript 因此它不知道或不关心是否涉及事件处理程序。 Rails 它只是一个字符串缓冲区。

这实际上是 js.erb 模板的一个主要概念问题,因为服务器端和客户端之间的上下文切换使得流程难以遵循。

此代码还有许多其他问题,例如 === 身份运算符的使用以及您在视图中执行数据库查询的事实是一个巨大的反模式。