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?

¿Fue útil?

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.

  1. nil valor es decir, " nil " almacenado en la base de datos
  2. vacío valor es decir " " una cadena vacía con sin espacios
  3. vacía cadena con espacios " " ;.
  4. 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?

  1. 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
    
  2. 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
    
  3. vacía cadena con espacios " " ;.

    2.2.2 :041 > object.attribute
    => " " 
    2.2.2 :042 > object.attribute.empty?
    => false
    
  4. 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?

  1. 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
    
  2. 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 
    
  3. vacía cadena con espacios " " ;.

    2.2.2 :057 > object.attribute
     => " " 
    2.2.2 :058 > object.attribute.nil?
     => false 
    
  4. 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?

  1. 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
    
  2. 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 
    
  3. vacía cadena con espacios " " ;.

    2.2.2 :073 > object.attribute
     => " " 
    2.2.2 :074 > object.attribute.blank?
     => true 
    
  4. 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?

  1. 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
    
  2. 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
    
  3. vacía cadena con espacios " " ;.

    2.2.2 :096 > object.attribute
     => " " 
    2.2.2 :097 > object.attribute.present?
     => false 
    
  4. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top