2011-01-21 8 views
6

He leído http://www.padrinorb.com/guides/application-helpers pero no estoy seguro de cuáles son los casos de uso para cada uno de los ayudantes de visualización. Específicamente, ¿cómo encajan todos juntos content_for/yield_content, render/partial, capture_html, and concat_content?Casos de uso para los diferentes haml helpers de Padrino

En este momento he estado usando render 'my/view' en mis controladores y lanzando algo de =partial 'my/partial' dentro de 'my/view' solo para separar el archivo de la plantilla principal en trozos más pequeños.

¿Es la forma correcta de hacerlo? ¿Y cuándo/dónde querría usar las otras funciones auxiliares?

Respuesta

12

Repasemos los casos de uso.

  1. content_for/yield_content

Esto es para inyectar un contenido en un archivo de diseño que podrían ser útiles. Ejemplo es agregar css/scripts adicionales en un diseño de otra plantilla. El ejemplo en la guía es el mismo, que muestra cómo agregar archivos CSS a su diseño desde cualquier plantilla que los requiera. También puede usarlo para agregar contenido a barras laterales, enlaces adicionales, etc. Es para cosas que no requieren su propia plantilla pero que necesitan pasar información a un diseño basado en la vista que se muestra.

  1. rinde/parcial

render es para mostrar una plantilla dada asociado con una ruta. render debe usarse para las acciones principales después de procesar una ruta. parcial es como un 'método' en una vista. Se puede reutilizar y se pueden pasar variables para cambiar el resultado. Utiliza parciales en plantillas principales para dividir código y reutilizar fragmentos de vistas que, de lo contrario, podrían parecer redundantes.

  1. capture_html/concat_content

Esto normalmente se utiliza para crear sus propios ayudantes que tienen bloques de contenido. Por ejemplo, creemos un helper que tome un bloque haml y lo envuelva en un div. El uso es el siguiente:

# template.haml 
# NOTE the equals so the content is returned 
# and added to the view directly 
= div_wrapper do 
    %h1 Some heading 
    %p This is now wrapped in a div 

Para implementar esto y usarlo en una plantilla, tiene que ser capaz de 'captura' del haml pasado en el bloque con el fin de procesar y luego envolver un div alrededor de ella. Aquí es donde entra en juego capture_html:

def div_wrapper(&block) 
    nested_content = capture_html(&block) 
    content_tag(:div, nested_content) 
end 

Esto tendrá el contenido y escupirla en la vista envuelta en un div. Ahora, vamos a suponer que queremos esta ayuda sea más complejo y por lo que desea el uso de ser de la misma familia:

# template.haml 
# NOTE the dash so the content is not outputted directly 
- div_wrapper do 
    %h1 Some heading 
    %p This is now wrapped in a div 

pero también funciona en otros ayudantes:

# some_helper.rb 
def example(name) 
    div_wrapper { "<h1>Test</h1>" } 
end 

Para adecuadamente imprime el contenido envuelto del asistente en una plantilla Y en rubí, podemos usar concat_content y verificar si necesitamos 'concat' el resultado a la plantilla o simplemente devolverlo.

def div_wrapper(&block) 
    nested_content = capture_html(&block) 
    tag_result = content_tag(:div, nested_content) 
    block_is_template?(block) ? concat_content(tag_result) : tag_result 
end 

Espero que esto funcione como una descripción general básica. Las funciones pueden superponerse, pero en general queda claro cuándo usarlas según el contexto específico.

+0

Esto es realmente útil, gracias. – ghostfly