rails how content_for application ruby-on-rails ruby asset-pipeline content-for

ruby-on-rails - how - render a partial rails



Ruby on Rails: proporcionar vs content_for (2)

Tenía curiosidad por ver cuál era la diferencia, y como Thong Kuah señaló a la API, dentro de la respuesta:

Esto significa que, si tiene rendimiento: título en su diseño y desea utilizar la transmisión, tendría que representar toda la plantilla (y, finalmente, activar todas las consultas) antes de transmitir el título y todos los activos, lo que mata el propósito de la transmisión. Por esta razón, Rails 3.1 presenta un nuevo ayudante llamado proporcionar que hace lo mismo que content_for, pero le dice al diseño que deje de buscar otras entradas y continúe renderizando.

Me encontré con la función de ayuda de vista "proporcionar" hoy. Al mirar su manual, todavía estoy confundido sobre cómo es diferente de "content_for".

proporcionar (nombre, contenido = nil, y bloque)

Lo mismo que content_for pero cuando se usa con descargas de flujo directo al diseño. En otras palabras, si desea concatenar varias veces al mismo búfer cuando se procesa una plantilla determinada, debe usar content_for, si no, use proporcionar para indicar al diseño que deje de buscar más contenidos.

Pregunta 1: esto es bastante abstracto para mí: ¿podría alguien concretarlo dando un ejemplo demostrativo?

Pregunta 2: trabajar con la cartera de activos, ¿cuál funciona mejor y por qué?

¡Gracias!


En primer lugar, ¿qué es el streaming? ¿Por qué lo usarías?

La transmisión es un método alternativo para representar páginas de arriba a abajo (fuera de adentro). El comportamiento de renderizado predeterminado es de adentro hacia afuera. La transmisión debe estar habilitada en su controlador:

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

Según la api.rubyonrails.org/classes/ActionController/Streaming.html :

La transmisión puede considerarse una exageración para acciones livianas como nuevas o editar. El beneficio real de la transmisión radica en acciones costosas que, por ejemplo, hacen muchas consultas en la base de datos.

Entonces, si no estás usando la transmisión, ¿todavía hay una diferencia?

Sí.

La diferencia es que una plantilla puede definir múltiples bloques de contenido llamando a content_for varias veces. Al hacerlo, se concatenarán los bloques y se los pasará al diseño:

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

Dado que el provide no continúa buscando en la plantilla proporcionada, solo se enviará a la plantilla el bloque que se pasó a la primera llamada 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>