Как асинхронно загружать частичную страницу в рельсах
При создании ruby на приложении rails/jquery есть часть страницы, которая требует много времени для генерации.
Я хочу изменить способ загрузки страницы, чтобы сразу загрузилась большая часть страницы, а местозаполнитель зарезервирован для того, чтобы трудоемкая часть загружалась асинхронно и была добавлена на страницу с помощью ajax/jquery, когда она закончил.
Что я сейчас (упрощен):
app/views/sample/show.html.erb:
<div id="theResult">
<%= render :partial => 'calculate', :object => @org) %>
</div>
и частичная часть будет использовать некоторые части @org для создания некоторого контента (нажатие другой внешней службы REST).
приложение/просмотров/образец/_calculate.html.erb
<%
# code to take org and turn it into content
%>
<!--...html to display results here -->
Я понимаю, что это, вероятно, нарушает правильные правила архитектуры MVC, поскольку у моего частичного, похоже, слишком много логики, и он тоже хотел бы очистить это...
Итак, я думаю, у меня есть два вопроса в одном: (1) как я могу заставить это работать, и (2) как его очистить, чтобы следовать хорошим правилам ruby /rails/mvc?
Ответы
Ответ 1
Сначала поместите пустой, разделитель div в основной ответ
<div id="pink-dancing-elephants"></div>
а затем добавьте немного jQuery на страницу
$.ajax({
url: "/elephants/dancing",
cache: false,
success: function(html){
$("#pink-dancing-elephants").append(html);
}
});
и у вас есть действие, в котором ответы/слоны/танцы/розовые возвращают blob HTML, которые вы хотите заполнить div. В действии, вызванном запросом AJAX, вы хотите сделать с помощью: layout = > false, чтобы вернуть возвращенный blob HTML из всего кадра. Например.
# elephants_controller.rb
def dancing
@elephants = #whatever
render :layout => false
end
Это приведет к отображению шаблона в представлениях/слонах/dancing.html.erb.
Ответ 2
Есть более простой способ сделать это по сравнению с @cailinanne.
Используя тот же пример, но я стараюсь использовать этот метод для обновления div, поэтому мой div сначала получит частичное:
<div id="pink-dancing-elephants">
<%= render "elephants/dancing", elephant: some_thing %>
</div>
Но затем используйте метод загрузки jQuery:
$("#pink-dancing-elephants").load("/elephants/dancing");
Это вернет все частичное. Обязательно используйте макет: false и необязательно задайте параметры. Я склонен использовать частичное, подобное этому
# elephants_controller.rb
def dancing
render "elephants/_dancing",
locals: { elephant: some_thing },
layout: false
end
Это создаст шаблон в представлениях/слонах/_dancing.html.erb.
УКАЗАНИЕ подчеркивание в частичном имени для метода контроллера и то, как вы не используете его при вызове рендеринга в представлении.