Традиционным способом сделать это в Rails было рендеринг нового фрагмента HTML на сервере и отправка его в браузер, завернутый в JavaScript, который знает, как обновить DOM с помощью нового HTML, когда браузер получил и оценил это.
Для этого вам нужно настроить несколько вещей:
- Фрагмент, который вы хотите визуализировать динамически, должен быть перемещен в часть, чтобы вы могли визуализировать его независимо от любого представления
- Вам нужен идентификатор для содержащего элемента, чтобы вы могли легко определить, куда вставить повторно обработанный HTML
- Вам необходимо представление
.js
, которое может отображать частичное, а также JavaScript, необходимый для обновления DOM.
- Вы должны использовать удаленные ссылки
Ваши HTML-представления должны выглядеть примерно так:
# pages.home.html.erb
<div id="favorites-div">
<%= render 'votes' %>
</div>
# votes.html.erb
<% if current_user.voted_for? item %>
<%= link_to '<i class="fas fa-minus-square plus_and_minus_button"></i>'.html_safe, item_unlike_path(item), data: { remote: true }%>
<% else %>
<%= link_to '<i class="fas fa-plus-square plus_and_minus_button"></i>'.html_safe, item_like_path(item), data: { remote: true } %>
<% end %>
Ваше новое представление JavaScript должно визуализировать частичное и заменить существующий HTML новым HTML, используя помощник j
для экранирования символов JavaScript в возвращаемой строке:
# unlike.js.erb
$('#favorites-div').html('<%=j render 'votes' %>')