2015-01-07 6 views
25

Ich stieß auf die Ansicht Hilfsfunktion "bieten" heute. Wenn ich in sein Handbuch schaue, bin ich immer noch verwirrt darüber, wie es sich von "content_for" unterscheidet.Ruby on Rails: liefern vs content_for

liefern (Name, content = nil, & Block)

Die gleiche wie content_for aber wenn sie mit streaming Wallungen geraden zurück zu dem Layout verwendet. Mit anderen Worten, wenn Sie beim Rendern einer gegebenen Vorlage mehrere Mal mit demselben Puffer verketten wollen, sollten Sie content_for verwenden, falls nicht, verwenden Sie provide, um das Layout anzuweisen, zu stoppen, um nach weiteren Inhalten zu suchen.

Frage 1: Das ist ziemlich abstrakt für mich - könnte jemand es ausstellen, indem es ein demonstratives Beispiel gibt?

Frage 2: Arbeiten mit Asset-Pipeline, die besser funktioniert und warum?

Danke!

+2

Kennen Sie http://api.rubyonrails.org/classes/ActionController/Streaming.html? –

+0

Ehrlich, nein, bevor Sie es erwähnen. Ich habe mir nur den Ref gesehen, den du geteilt hast, und er ist exzellent. Ich wusste nie, dass Rails die Vorlage standardmäßig vor dem Layout lädt! Mit Streaming können Sie diese Reihenfolge wiederherstellen. Dann..? – Bruce

+0

So ist es implementiert, der Hauptvorteil von Streaming besteht darin, dass Teile der Seite (insbesondere Header JS) zurück zum Browser gestreamt werden können, wenn sie bereit sind, anstatt auf die ganze Seite zu warten. –

Antwort

22

Zunächst einmal, was ist Streaming? Warum würdest du es benutzen?

Streaming ist eine alternative Methode zum Rendern von Seiten von oben nach unten (von außen nach innen). Das Standard-Rendering-Verhalten ist von innen nach außen.

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

Nach dem documentation: Streaming müssen in Ihrem Controller aktiviert werden

Streaming angesehen werden können Overkill sein für leichte Aktionen wie neu oder bearbeiten. Der eigentliche Vorteil des Streams liegt in den teuren Aktionen, die zum Beispiel viele Abfragen in der Datenbank ausführen.

Also, wenn Sie nicht Streaming verwenden, gibt es noch einen Unterschied?

Ja.

Der Unterschied ist eine Vorlage kann mehrere Inhaltsblöcke durch mehrere Anrufe content_for definieren.Dadurch werden die Blöcke so verketten und an das Layout übergeben:

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

Da providenicht fortgesetzt die bereitgestellte Vorlage suchen, wird nur der Block mit dem ersten provide Aufruf übergeben wird an der Vorlage zu senden:

# 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' auch * append * Inhalte in' view_flow'. Die einzige Möglichkeit, Inhalte für den Schlüssel zu überschreiben, ist 'content_for' mit der Option' flush: true'. – mmtootmm

5

war neugierig zu sehen, was der Unterschied war, und als Thong Kuah auf die api darauf, in der Antwort:

Das bedeutet, dass, wenn Sie Ausbeute haben: Titel in Ihrem Layout und Sie Streaming verwenden möchten , müssten Sie die gesamte Vorlage rendern (und eventuell alle Abfragen auslösen), bevor Sie den Titel und alle Assets streamen, was den Zweck des Streamings zunichte macht. Aus diesem Grund führt Rails 3.1 einen neuen Helfer namens provide ein, der dasselbe wie content_for tut, aber das Layout anweist, die Suche nach anderen Einträgen zu stoppen und mit dem Rendering fortzufahren.