2015-01-07 14 views
25

Natknąłem się obecnie na funkcję podglądu widoku "zapewnij". Analizując jego podręcznik, nadal nie rozumiem, jak to się różni od "content_for".Ruby on Rails: provide vs content_for

otrzymując (nazwa = zawartość nil & bloku)

samo jak content_for ale gdy stosuje strumieniowe spłuczek prosto z powrotem do układu. Innymi słowy, jeśli chcesz połączyć kilka razy ten sam bufor podczas renderowania danego szablonu, powinieneś użyć użyć content_for, jeśli nie, użyj opcji dostarczyć, aby układ przestał szukać więcej treści.

Pytanie 1: jest to dla mnie dość abstrakcyjne - czy ktokolwiek mógłby je przedstawić, dając przykład demonstracyjny?

Pytanie 2: praca z potokiem aktywów, który działa lepiej i dlaczego?

Dzięki!

+2

Czy znasz http://api.rubyonrails.org/classes/ActionController/Streaming.html? –

+0

Szczerze, nie, zanim o tym wspomnisz. Po prostu przyjrzałem się ref, który udostępniłeś i jest doskonały. Nigdy nie wiedziałem, że domyślnie szablon ładowania Railsów przed układem! Więc streaming to sposób na odwrócenie tej kolejności. Następnie..? – Bruce

+0

Tak właśnie zostało zaimplementowane, główną zaletą przesyłania strumieniowego jest umożliwienie przesyłania części strony (w szczególności nagłówka JS) do przeglądarki, gdy jest ona gotowa, zamiast czekania na całą stronę. –

Odpowiedz

22

Po pierwsze, jakie jest strumieniowanie? Dlaczego miałbyś go używać?

Strumieniowanie to alternatywna metoda renderowania stron z góry na dół (na zewnątrz). Domyślne zachowanie renderowania ma charakter wewnętrzny. Streaming musi być włączone w Twojej kontrolera:

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

Według documentation:

żywo mogą być uznane za przesadą lekkich działań jak nowe lub edytować. Prawdziwa korzyść z przesyłania strumieniowego to kosztowne działania, które na przykład wykonują wiele zapytań w bazie danych.

Tak więc, jeśli nie korzystasz z przesyłania strumieniowego, czy nadal występuje różnica?

Tak.

Różnica jest szablonem można zdefiniować wielu bloków treści dzwoniąc content_for wiele razy.Spowoduje to złączyć bloki i przekazać, że do układu:

# layout.html.erb 
<div class="heading"><%= yield :surprise %></div> 
<div class="body"> 
    <p><%= yield %></p> 
    <p>But it's 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's not very interesting...</p> 
</div> 

Od providenie kontynuować poszukiwania dostarczonego szablonu, tylko blok przeszedł do pierwszego provide zaproszenia zostaną wysłane do szablonu:

# 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> 
+1

'provide' również * dołącz * zawartość w' view_flow'. jedynym sposobem nadpisania zawartości dla klucza jest użycie 'content_for' z opcją' flush: true'. – mmtootmm

5

był ciekaw, aby zobaczyć, jaka jest różnica była i jak Thong Kuah wskazał api, wewnątrz odpowiedź:

Oznacza to, że jeśli masz wydajność: tytuł w układzie i chcesz korzystać z transmisji strumieniowej , musiałbyś wyrenderować cały szablon (i ostatecznie wywołać wszystkie zapytania) przed przesłaniem tytułu i wszystkich zasobów, co zabija cel streamingu. Z tego powodu Rails 3.1 wprowadza nowy helper o nazwie provide, który robi to samo, co content_for, ale nakazuje układowi, aby przestał wyszukiwać inne wpisy i kontynuował renderowanie.