2008-11-12 22 views
7

En mis modelos, hay muchos atributos y métodos que realizan algunos cálculos basados ​​en los atributos de la instancia del modelo. He estado haciendo que los métodos devuelvan nulo si los atributos de los que dependen los cálculos son nulos. Como consecuencia de esta decisión de diseño, estoy haciendo muchos controles nulos antes de mostrar estos valores en mis vistas.¿Debo evitar la comprobación nula en las vistas de Rails?

Pensé en hacer que estos métodos devuelvan cero en lugar de cero cuando no tienen suficiente información, pero elegí nil porque cero es un resultado de cálculo válido y nada implica que no hubo suficiente información.

¿Debo devolver 0 en lugar de cero? ¿Hay algún otro patrón que pueda usar para evitar hacer un montón de controles nulos en mis puntos de vista?

Respuesta

8

Tiendo a pensar que estás haciendo las cosas bien si tu problema es elegir si mostrar o no los resultados de un cálculo. Si no tiene sentido mostrar ningún valor, entonces nada es perfectamente razonable.

Si, sin embargo, su lógica comercial está provocando que se encuentre en un estado en el que gran parte de la vista estará habitualmente en blanco, entonces probablemente deba refactorizar de manera tal que su programa pierda sus abstracciones con fugas.

Considere, por ejemplo, una aplicación que comienza con el seguimiento de recetas para Food. Luego, a medida que los requisitos cambian, obtenemos la noción de que los pasteles necesitan mostrar información diferente a las hamburguesas. En lugar de tener un método calculate_deliciousness_of_pie_or_nil_for_burger, y luego comprobar si no hay nada en la vista, lo dividiría en una vista circular para pasteles y una vista de hamburguesa para hamburguesas. Esto podría (probablemente) requeriría replantear mis abstracciones de objetos.

3

"Estoy haciendo una gran cantidad de cheques nulos antes de mostrar estos valores en mis puntos de vista."

Creo que devolver nil es una buena idea. Una alternativa que a veces uso es devolver un hash. Por ejemplo, si un método tuvo éxito, podría volver:

{:result => 1234} 

y si el método de "no", podría volver:

{:error => 'Insufficient attributes to calculate result.'} 

Esto hace que sea trivial para determinar el resultado sin adivinar.

Dicho esto, asegúrese de crear métodos de ayuda para llamar a estos métodos y comprobar sus resultados. Las vistas deben contener muy poca lógica. Así que en lugar de hacer esto para controlar si se muestra o no el resultado:

<% if result = some_method -%> 
    Your result is <%=h result -%>.<br /> 
<% end -%> 

usted debe hacer esto:

<% display_some_method %> 

y #display_ some_ método se encuentra en app/helpers/whatever_helper.rb.

+1

Debe usar == en el ejemplo anterior. – maurycy

1

Ataco este problema utilizando dos enfoques.

Intento mover cheques más exigentes al modelo.Por ejemplo, el método Apartment#address_visible?(current_user) lo hace mucho más limpio.

Desde Rails 2.3 también existe el método #try que llama a un método solo si ya está definido. Se puede incluir fácilmente en su proyecto usando chris 'example. Esto es para los casos más simples.

+0

si no está en 2.3, también hay andand y http://github.com/raganwald/andand –

Cuestiones relacionadas