Rails рендеринг частичек, даже когда закомментирован - PullRequest
1 голос
/ 13 апреля 2020

Мне любопытно, как Rails 5 рендерит партиалы и есть ли недоработка, о которой я не знаю. У меня на странице две части, одна из которых отображается как часть html, а другая - внутри успешного обратного вызова запроса ajax. Однако, когда я обновляю sh страницу, частичное внутри запроса 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 также рендерит, чего не должно быть, поскольку обработчик щелчков, в котором он находится, не был запущен.

rails server output

Любое понимание приветствуется.

1 Ответ

1 голос
/ 13 апреля 2020

Я всегда предполагал, что партиалы отображаются во время выполнения строки кода.

Ключом здесь является понимание того, когда выполняется код. При динамическом создании javascript с js.erb файл сначала запускается через ERB на сервере, а затем отправляется клиенту, который запускает полученный javascript. Ваш сервер фактически не анализирует javascript, поэтому он не знает и не заботится о том, что задействован обработчик событий. Для Rails это просто строковый буфер.

На самом деле это большая концептуальная проблема с шаблонами js.erb, так как переключение контекста между сервером и клиентом затрудняет отслеживание потока.

Есть также множество других проблем с этим кодом, таких как использование оператора идентификации === и тот факт, что выполняемые вами БД запрашивают представление, которое является огромным анти-паттерном.

...