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

Ruby on Rails: предоставить vs content_for

Я столкнулся с функцией помощника вида "обеспечиваю" сегодня. Изучая его руководство, я все еще смущен тем, как он отличается от "content_for".

предоставить (имя, содержимое = нуль, блок)

То же, что и content_for, но при использовании с потоковыми потоками прямо вернуться к макету. Другими словами, если вы хотите объединить несколько раз в тот же буфер при рендеринге данного шаблона, вы должны используйте content_for, если нет, используйте команду, чтобы сообщить макету остановиться ищет больше содержимого.

Вопрос 1: это довольно абстрактно для меня - может ли кто-нибудь сформулировать это, представив демонстративный пример?

Вопрос 2: работа с конвейером активов, которая работает лучше и почему?

Спасибо!

4b9b3361

Ответ 1

Прежде всего, что такое потоковое вещание? Почему вы его используете?

Потоковая передача - это альтернативный способ отображения страниц сверху вниз (внешний). Поведение рендеринга по умолчанию - наизнанку. Потоковая передача должна быть включена в вашем контроллере:

class MyController
  def action
    render stream: true # Streaming enabled
  end
end

В соответствии с документацией:

Потоки можно считать излишними для облегченных действий как новый или редактировать. Реальная польза от потоковой передачи действия, которые, например, выполняют много запросов в базе данных.

Итак, если вы не используете потоковое вещание, есть ли разница?

Да.

Разница заключается в том, что шаблон может определять несколько блоков контента, вызывая content_for несколько раз. Это позволит объединить блоки и передать их в макет:

# layout.html.erb
<div class="heading"><%= yield :surprise %></div>
<div class="body">
   <p><%= yield %></p>
   <p>But it not very interesting...</p>
</div>

# template.html.erb
<%= content_for :surprise, "Hello" %>
I've got your content!
<%= content_for :surprise, ", World!" %>

# Generated HTML
<div class="heading">Hello, World!</div>
<div class="body">
   <p>I've got your content!</p>
   <p>But it not very interesting...</p>
</div>

Так как provide не продолжает поиск предоставленного шаблона, только шаблон, переданный первому вызову provide, будет отправлен в шаблон:

# layout.html.erb
<div class="heading"><%= yield :title %></div>

# template.html.erb
<%= provide :title, "Foo" %>
<%= provide :title, "bar" %>

# Generated HTML
<div class="heading">Foo</div>

Ответ 2

Было любопытно посмотреть, какая разница, и как Тонг Куах указал на api, внутри ответа:

Это означает, что если у вас есть доход: заголовок в макете и вы хотите использовать потоковое воспроизведение, вам нужно будет отобразить весь шаблон (и в конечном итоге вызвать все запросы) до потоковой передачи заголовка и всех активов, что убивает цель потоковой передачи. По этой причине Rails 3.1 представляет новый помощник, предоставляющий, который делает то же самое, что и content_for, но сообщает макету прекратить поиск других записей и продолжить рендеринг.