【问题标题】:Rails rendering partials even when commented out即使被注释掉,Rails 也会渲染部分内容
【发布时间】:2020-07-25 17:11:00
【问题描述】:

我很好奇 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 也会呈现,但它不应该呈现,因为它所在的点击处理程序没有被触发。

任何见解都值得赞赏。

【问题讨论】:

  • 能否请您在整个项目中使用 grep 'test_partial',也许您可​​以在其他地方渲染它?也许在'popover_notifications.html.erb'里面?
  • 嗨@Vasilisa 不幸的是,这是我唯一拥有它的地方

标签: javascript jquery ruby-on-rails ruby-on-rails-5 partials


【解决方案1】:

我一直认为部分渲染是在代码行运行时呈现的。

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

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

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

【讨论】:

  • turbolinks 也将替换 body 元素。如果您想委托事件,请从文档中进行。
  • 谢谢@max,这是有道理的。在 ajax 调用将“未读”通知更改为“已读”通知之后,我试图将引导弹出窗口的“内容”设置为部分的更新版本。我怎么能做到这一点?另外,另一个问题:我明白你在视图中执行数据库查询的意思——我该如何解决这个问题?我工作的另一个开发人员(他在 Rails 方面比我有更多的经验,因为我是新手)在其他地方使用这种模式,所以我只是遵循它。再次感谢。
  • 这取决于具体的变化。如果它只是表示的简单更改(例如将其变灰),您只需在元素上切换一个类并在后台进行乐观更新。如果由于某种原因必须在 rails 中重新渲染整个内容,则需要将渲染的元素作为 JSON 字符串返回,或者创建一个 JS.erb 模板来替换该元素。这种类型超出了您原始问题的范围,因此请将其作为一个单独的问题提出。
  • 通过在视图中执行数据库查询,我的意思正是如此。在该屏幕截图中,您有&lt;% unread_notifications = Notifications.unread(current_user) %&gt;。如果您曾经研究过例如 Wordpress 主题,您就会明白为什么这是有问题的 - 最终您将触发大量的 db 请求,而您的视图已经非常混乱,因为它混合了 html 和 ruby​​ 变成垃圾箱着火了。
  • 如果您在控制器中预先查询所需的数据,则很容易获得概览并通过连接和预加载优化查询,这样您就不会遇到 N+1 查询问题。它也是您的大学似乎理解的良好 MVC 设计的租户。 jasoncharnes.com/remove-activerecord-views
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 2015-11-28
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多