Я не уверен на 100%, что это Rails-одобренный способ сделать это, но я нашел решение, которое работает и кажется довольно чистым. Допустим, у нас есть страница со списком десяти самых популярных продуктов в нашей базе данных. В конце ссылка для загрузки всех оставшихся продуктов через AJAX:
<ul id="products-list">
<li>...</li>
<li>...</li>
<li>...</li>
...
</ul>
<%= link_to "more...", "/products/all", :id => "load-more", :remote => true %>
Сервер возвращает простой HTML (чтобы ссылка могла использоваться на многих страницах и не была привязана к определенным идентификаторам DOM). Мы используем события ajax:x
, запускаемые драйверами UJS Rails (здесь я использую jQuery), чтобы получить ответ сервера и вставить его в нужный элемент на странице:
<%= javascript_tag do %>
$("#load-more").bind("ajax:complete", function(et, e){
$("#products-list").html(e.responseText);
});
<% end %>
При желании мы также можем использовать событие ajax:loading
, чтобы показать «счетчик»:
<%= javascript_tag do %>
$("load-more").bind("ajax:loading", function(et, e){
$(this).hide();
$("#products-spinner").show();
});
<% end %>
Драйверы Rails UJS также запускают четыре других события: ajax:success
, ajax:failure
, ajax:before
и ajax:after
. См. Драйвер, включенный в ваше приложение (public / javascripts / rails.js) для получения дополнительной информации.