Rails: ¿Cómo verifico si una columna tiene un valor?
-
08-07-2019 - |
Pregunta
¿Cómo puedo lograr esto?
<% for agent in @broker.agents %>
...
<% if agent.cell %><span class="cell-number">Cell: <%= agent.cell %></span><% end %>
...
<% end %>
Quiero probar para ver si el agente tiene un número de celda, y si es así, mostrar qué hay dentro del condicional. Lo que tengo actualmente no parece funcionar; solo muestra " Celda: " ;.
¿Pensamientos?
Solución
Esto es lo que pediste:
<% for agent in @broker.agents %>
<% unless agent.cell.blank? %>
<span class="cell-number">Cell: <%= agent.cell %></span>
<% end %>
<% end %>
¿La celda? El método funciona si la celda es nula o una cadena vacía. Rails agrega funciones similares para todos los atributos de ActiveRecord. Esto se verá un poco mejor:
<% for agent in @broker.agents %>
<span class="cell-number">
Cell: <%= agent.cell? ? "none given" : agent.cell %>
</span>
<% end %>
El signo de interrogación y los dos puntos forman un rápido "si"? entonces: más '' declaración. ¿Hay dos signos de interrogación en el código anterior porque uno es parte de la celda del nombre del método? y el otro es parte de la construcción if / then / else.
Otros consejos
Estoy dando una respuesta muy detallada a esta pregunta " ¿Cómo verifico si una columna tiene un valor? " ;.
En primer lugar, es importante tener en cuenta que un atributo puede tener cuatro tipos de valores.
- nil valor es decir, " nil " almacenado en la base de datos
- vacío valor es decir " " una cadena vacía con sin espacios
- vacía cadena con espacios " " ;.
- valor presente en la base de datos, es decir, una cadena no vacía .
Aquí está el comportamiento detallado de todos los métodos actuales (Ruby 2.2.2) que podrían usarse en este caso.
Primer método: .empty?
-
Para nulo value = > Lanza una excepción
2.2.2 :037 > object.attribute => nil 2.2.2 :025 > object.attribute.empty? NoMethodError: undefined method `empty?' for nil:NilClass
-
Para el valor vacío , es decir, " " una cadena vacía con sin espacios
2.2.2 :037 > object.attribute => "" 2.2.2 :025 > object.attribute.empty? true
vacía cadena con espacios " " ;.
2.2.2 :041 > object.attribute => " " 2.2.2 :042 > object.attribute.empty? => false
-
valor presente en la base de datos, es decir, una cadena no vacía .
2.2.2 :045 > object.attribute => "some value" 2.2.2 :046 > object.attribute.empty? => false
Segundo método: .nil?
nil valor es decir, " nil " almacenado en la base de datos
2.2.2 :049 > object.attribute => nil 2.2.2 :050 > object.attribute.nil? => true
vacío valor, es decir " " una cadena vacía con sin espacios
2.2.2 :053 > object.attribute => "" 2.2.2 :054 > object.attribute.nil? => false
vacía cadena con espacios " " ;.
2.2.2 :057 > object.attribute => " " 2.2.2 :058 > object.attribute.nil? => false
-
valor presente en la base de datos, es decir, una cadena no vacía .
2.2.2 :061 > object.attribute => "some value" 2.2.2 :062 > object.attribute.nil? => false
Tercer método: .blank?
nil valor es decir, " nil " almacenado en la base de datos
2.2.2 :065 > object.attribute => nil 2.2.2 :066 > object.attribute.blank? => true
vacío valor, es decir " " una cadena vacía con sin espacios
2.2.2 :069 > object.attribute => "" 2.2.2 :070 > object.attribute.blank? => true
vacía cadena con espacios " " ;.
2.2.2 :073 > object.attribute => " " 2.2.2 :074 > object.attribute.blank? => true
-
valor presente en la base de datos, es decir, una cadena no vacía .
2.2.2 :075 > object.attribute => "some value" 2.2.2 :076 > object.attribute.blank? => false
Cuarto método: .present?
nil valor es decir, " nil " almacenado en la base de datos
2.2.2 :088 > object.attribute => nil 2.2.2 :089 > object.attribute.present? => false
vacío valor, es decir " " una cadena vacía con sin espacios
2.2.2 :092 > object.attribute => "" 2.2.2 :093 > object.attribute.present? => false
vacía cadena con espacios " " ;.
2.2.2 :096 > object.attribute => " " 2.2.2 :097 > object.attribute.present? => false
-
valor presente en la base de datos, es decir, una cadena no vacía .
2.2.2 :100 > object.attribute => "some value" 2.2.2 :101 > object.attribute.present? => true
Puede usar cualquiera de los cuatro dependiendo de la situación que enfrente.
Gracias
if !agent.cell.blank?
Funciona.
agente.celda? parece funcionar igual que agent.cell.blank? en RoR.
<% @broker.agents.each do |agent| %>
...
<% unless agent.cell.empty? %>
<span class="cell-number">Cell: <%= agent.cell %></span>
<% end %>
...
<% end %>
Creo que el uso de #each, a menos que
y cell.empty?
sea más legible y fácil de entender a primera vista.