2010-02-27 9 views
12

Me gustaría mostrar una línea de texto solo si se establece un objeto llamado @foo. En mi opinión, estoy intentando algo como esto:¿Cómo comprobar si un objeto es nulo en una vista en Ruby?

<% if [email protected]_record? || [email protected]? %> 
    Foo is not a new record or nil 
<% end %> 

Pero esto no funciona, volver You have a nil object when you didn't expect it! Estoy bastante seguro de que esto sucede debido al método new_record?. ¿Cómo verifico si algo no es un registro nuevo o nulo sin causar un error? En PHP, se obtendría preguntando if(!empty($foo)) pero incluso el método empty? en rieles causa el mismo error que se devuelve.

¿Alguna idea?

Respuesta

13

¿Qué tal:

<% if [email protected]? && [email protected]_record? %> 
    Hello! 
<% end %> 

En primer lugar, tiene que estar usando lógica Y en lugar de la lógica OR aquí, ya cualquier objeto ActiveRecord se reúne al menos uno de los requisitos de "no nulo" o "no un nuevo récord ".

En segundo lugar, la comprobación de nil primero asegura que la segunda comprobación no se ejecuta si la primera falla. El error se produce porque no puede usar #new_record? en un objeto que no lo admite, por lo que la comprobación de nil primero garantiza que ese método nunca se ejecute en un nil.

+0

¡más intuitivo! ¡gracias! –

+1

También podría mejorar un poco con la Ley de DeMorgan: 'menos @ foo.nil? || @ foo.new_record ?; pone '¡Hola!'; end; ' –

+4

'! foo.nil? 'hace sangrar mi cerebro porque simplemente puede ser reemplazado por' foo'. Haciendo esto una expresión de ruby ​​muy simple y común: 'if @foo &&! @ Foo.new_record?' –

1

Lo comprobaría por if @foo && @foo.id. Esto comprueba que haya un objeto @foo activerecord y se asegura de que el campo id no esté vacío. Si el campo id está vacío, significa que todavía no es un registro en la base de datos. Supongo que estás usando el campo id en la tabla.

+0

más conciso! ¡gracias! –

3

que podría estar interesado en estos, así:

<%= @foo.text if @foo.present? %> 

o

<%= @foo.text unless @foo.blank? %> 
+0

estos no verifican si @foo está vacío, pero gracias a los métodos extra –

1

La forma más sencilla es

<% if [email protected](:new_record) %> 
    Hello! 
<% end %> 
+0

parece que esto no está funcionando –

1

¿Hay una razón por la cual este objeto podría ser nulo cuando llega a la vista? A veces, agregar una lógica condicional como esta en la vista puede ser una señal de que algo puede ser refactorizado y simplemente está enmascarando un problema mayor.

0

Prefiero usar el andand gem para estas comprobaciones.

if @foo.andand.id 
    "Hello!" 
end 

La llamada a .id solo se realizará en objetos no nulos.

2

Déjame arrojar otra respuesta solo por diversión.

unless @foo.nil? or @foo.new_record? 
    "Hello" 
end 
Cuestiones relacionadas