¿Cómo funciona la magia en el rendimiento ActionView?
-
26-09-2019 - |
Pregunta
I era mirando cómo funciona content_for y observó la block.call
en el método capture_erb_with_buffer
. Aparentemente mágicamente escribe en la variable del búfer que se poda a continuación. Sin embargo, esto creo que es obsoleto y que sólo puede llamar <%=yield :tag%>
ahora. ¿Como funciona esto? Si llamo rendimiento a partir de una plantilla de ERB, donde hace que el rendimiento a?
A ejemplo de código simple para ilustrar el punto sería muy apreciada.
Solución
Esta pequeña diminuta método llamado execute
en ActionView::Base
lo explica todo.
http://google.com/codesearch/p?hl=en#m8Vht-lU3vE/vendor/rails/actionpack/lib/action_view/base.rb&q=capture_helper.rb&d=5&l=337
def execute(template)
send(template.method, template.locals) do |*names|
instance_variable_get "@content_for_#{names.first || 'layout'}"
end
end
El bloque do |*names|... end
es el que recibe la yield
. Se dará cuenta de que el @content_for_#{names.first}
coincide con la variable que se encuentra en el proceso de content_for
.
Se llama de Av :: :: TemplateHandlers compilable en #render, y yo asumiría otros lugares también.
def render(template)
@view.send :execute, template
end
Otros consejos
No estoy seguro de cómo funciona la yield
sobre el nivel de ERB, pero yo no sé cómo funciona cuando se aplica a los diseños.
Aquí está un archivo layout.html.erb ejemplo:
<html>
<head>
<title> <%= @title || 'Plain Title' %> </title>
<%= yield :head %>
</head>
<body>
<div id='menu'>
<%= yield :menu %>
</div>
<div id='content'>
<%= yield %>
</div>
<div id='footer'>
<%= yield :footer %>
</div>
</body>
he definido 4 rendimientos (: cabeza,: menú,: pie de página, y por defecto). Y un @title variable de instancia
Ahora las acciones del controlador pueden hacer que los puntos de vista de ranura en estos puntos. Tenga en cuenta que la vista hace antes de que el diseño, por lo que puede definir una variable como @title en una vista y lo han definido en la disposición.
vistas de la muestra: Una página Sobre
<% @title = 'About' %>
<% content_for :menu do %>
<%= link_to 'Back to Home', :action => :home %>
<% end %>
We rock!
<% content_for :footer do %>
An Illinois based company.
<% end %>
Una Editar página
<% @title = 'Edit' %>
<% content_for :head do %>
<style type='text/css'> .edit_form div {display:inline-block;} </style>
<% end %>
<% form_for :thing, :html => {:class => 'edit_form'} do |f| %>
...
<% end %>
Puede mezclar y combinar lo que produce que desea poner los datos en, y lo que ocurre en el content_for :something
se insertará en el yield :something
coincidente en el archivo de diseño.
También funciona para los parciales, una lata de inserción parcial de su propio content_for: Bloque de algo, que se agregarán con otras llamadas content_for.
Simplemente:
llamando rendimiento en un código ejecuta método que se pasa al método a través de un bloque.
Por ejemplo
def my_method
yield
end
my_method { puts "Hello" }
my_method { puts "World" }
estas 5 líneas producirá la siguiente salida a la pantalla
Hello
World
Consulte la página siguiente para un buen análisis de rendimiento en Ruby: Rubí Rendimiento