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.

¿Fue útil?

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

http://google.com/codesearch/p?hl=en#m8Vht-lU3vE/vendor/rails /actionpack/lib/action_view/template_handlers/compilable.rb&q=execute&exact_package=git://github.com/payalgupta/todo-list.git&sa=N&cd=17&ct=rc&l=28

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top