2010-03-04 19 views
31
parcial

No estoy seguro si estoy haciendo el mejor enfoque aquí, pero tengo un bloque de datos que quiero mostrar después de hacer una búsqueda y no estar allí en absoluto antes de. En primer lugar, no hay nada que mostrar, y en segundo lugar, el modelo al que hace referencia es nulo, por lo que arroja una excepción.Ruby on Rails: mostrar condicionalmente un

Coloqué este bloque en una plantilla parcial y lo agregué al lugar apropiado en mi diseño. ¿Hay alguna forma de procesar de forma limpia el parcial de forma condicional? ¿Hay una mejor manera de abordar este problema?

Respuesta

41

Rubí le permite hacer cosas agradables como este:

<%= render :partial => "foo/bar" if @conditions %> 

Para hacer esto un poco más fácil de leer y entender, se puede escribir como:

<%= render(:partial => "foo/bar") if @conditions %> 

render es una función, y le pasas un hash que le dice qué parte de renderizar. Ruby le permite poner las cosas en una línea (lo que a menudo las hace más legibles y concisas, especialmente en las vistas), por lo que la sección if @conditions es solo una declaración regular de if. También se puede hacer como:

<% if @conditions %> 
    <%= render :partial => "foo/bar" %> 
<% end %> 

Editar:

Rubí también le permite utilizar la palabra clave unless en lugar de if. Esto hace que el código sea aún más legible y evita que tenga que hacer comparaciones negativas.

<%= render :partial => "foo/bar" if [email protected] %> 
#becomes 
<%= render :partial => "foo/bar" unless @conditions %> 
+0

'<% = render: partial =>" foo/bar "a menos que @conditions%>' sea la concisión que estaba buscando. Y, con respecto a su comentario a continuación, estoy de acuerdo en que sería absurdo ser completamente dogmático sobre la separación de las preocupaciones. Esa es realmente una de las razones por las que me gusta que Rails modele la flexibilidad en comparación con un sistema como Django. Pero me gusta limitarlo cuando sea posible. Recuerdos de pesadilla a mis días haciendo asp clásico, supongo. ¡Gracias por la ayuda! –

+0

No hay problema. La parte difícil de cambiar de algo como ASP es definir dónde termina su lógica de aplicación/negocio, y dónde comienza la lógica de vista. –

5

Una manera fácil es usar un método de ayuda. Los ayudantes tienden a ser un poco más limpios que poner la lógica directamente en la vista.

Por lo tanto, su punto de vista podría ser algo como:

<%= render_stuff_conditionally %> 

y su ayudante tendría un método para controlar esto:

def render_stuff_conditionally 
    if @contional_check 
    render :partial => 'stuff' 
    end 
end 

donde, obviamente, las cosas se nombran de manera más apropiada

+0

De acuerdo, poner la lógica en un ayudante es lo mejor. – bojo

+1

No estoy de acuerdo. Hay una clara diferencia entre la lógica del controlador y la lógica de la vista, y esta es la lógica de la vista. Se puede lograr como un delineador de líneas concisas como sugerí. Esta opción solo hace que sea más difícil averiguar qué condiciones se están verificando al depurar o mantener el código. –

+2

Creo que vale la pena considerar la situación y lo que en realidad estás obteniendo al usar o no usar un ayudante. Si el código que está considerando insertar en un ayudante mejorará la legibilidad de la vista, puede valer la pena para usted. Si dejar el condicional (o el código) dentro de la vista hace que el código sea más legible y mantenible, también hay que considerarlo. Los ayudantes pueden terminar siendo un cajón de sastre para todo tipo de código, en ese caso su código de vista puede ser hermoso, pero acaba de "exprimir el globo" (y el desastre no desapareció). – Tass

1

Asumiendo Te estoy siguiendo bien, haces esto en el nivel de vista.

<% if [email protected]_search_data.nil? %> 
<% render :partial => 'foo/bar' %> 
<% end %> 

Espero que ayude. Si no, tal vez publique un ejemplo de su código.

+1

Eso es realmente lo que hice mientras esperaba una respuesta. Funciona, pero prefiero evitar la lógica condicional en una vista si es razonablemente posible. –

+0

La solución de Pete es la mejor manera de hacerlo en ese caso. – bojo

+0

@Donald: No hay razón para evitar la lógica en las vistas. Hay una línea fina entre "lógica de vista" y "lógica de aplicación". –