Подтвердить что ты не робот

Как асинхронно загружать частичную страницу в рельсах

При создании 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?

4b9b3361

Ответ 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.

УКАЗАНИЕ подчеркивание в частичном имени для метода контроллера и то, как вы не используете его при вызове рендеринга в представлении.