2008-11-19 22 views
10

¿Cómo puedo lograr esto?Rieles: ¿Cómo puedo verificar si una columna tiene un valor?

<% for agent in @broker.agents %> 
    ... 
    <% if agent.cell %><span class="cell-number">Cell: <%= agent.cell %></span><% end %> 
    ... 
<% end %> 

Quiero poner a prueba para ver si el agente tiene un número de células, y si es así, mostrar lo que hay dentro de la condicional. Lo que tengo actualmente no parece funcionar; solo muestra "Celda:".

¿Pensamientos?

Respuesta

13

Esto es lo que pidieron:

<% for agent in @broker.agents %> 
    <% unless agent.cell.blank? %> 
    <span class="cell-number">Cell: <%= agent.cell %></span> 
    <% end %> 
<% end %> 

La célula? 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 más agradable:

<% for agent in @broker.agents %> 
    <span class="cell-number"> 
    Cell: <%= agent.cell? ? "none given" : agent.cell %> 
    </span> 
<% end %> 

El signo de interrogación y de colon forman un rápido "si a continuación:? Otra cosa" comunicado. ¿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 una parte de la construcción if/then/else.

+1

Puede simplificar esto haciendo '<% = agent.cell || "ninguno dado"%> ' –

4
if !agent.cell.blank? 

Funciona.

+2

Se podría considerar "a menos agent.cell.blank?", Que algunos afirman es "más Rubí-ish" –

+0

utilizo menos que a menos agent.cell.blank porque las dobles negaciones son impresionantes. – FlySwat

+2

También puede usar 'if agent.cell.present?' #present? devuelve lo opuesto a #blank? – paradoja

1

agent.cell? parece funcionar igual que agent.cell.blank? en RoR.

+0

No parece en los rieles 3.2.6 (o ruby ​​1.9) – Ben

0
<% @broker.agents.each do |agent| %> 
    ... 
    <% unless agent.cell.empty? %> 
    <span class="cell-number">Cell: <%= agent.cell %></span> 
    <% end %> 
    ... 
<% end %> 

Me parece que el uso de #each, unless y cell.empty? para ser más legible y más fácil de entender a primera vista.

4

Estoy dando una respuesta muy detallada a esta pregunta "¿Cómo puedo verificar si una columna tiene un valor?".

En primer lugar, es importante tener en cuenta que un atributo puede tener cuatro tipos de valores.

  1. nula valor es decir "nulo" almacenados en la base de datos
  2. vacío valor es decir "" una cadena vacía con sin espacios
  3. vacío cadena con espacios "".
  4. valor presente en la base de datos, es decir, cadena no vacía.

A continuación se detalla el comportamiento de todos los métodos presentes (Ruby 2.2.2) que podrían ser utilizados en este caso.

Primer método:.empty?

  1. Para nula valor => se produce 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 vacío valor 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ío 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ío.

    2.2.2 :045 > object.attribute 
    => "some value" 
    2.2.2 :046 > object.attribute.empty? 
    => false 
    

Segundo método:.nil?

  1. nulo valor es decir "nulo" almacenada 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ío 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ío.

    2.2.2 :061 > object.attribute 
    => "some value" 
    2.2.2 :062 > object.attribute.nil? 
    => false 
    

Tercer método:.blank?

  1. nulo valor es decir "nulo" almacenada en la base de datos

    2.2.2 :065 > object.attribute 
    => nil 
    2.2.2 :066 > object.attribute.blank? 
    => true 
    
  2. vacío valor i.e "" una cadena vacía con sin espacios

    2.2.2 :069 > object.attribute 
    => "" 
    2.2.2 :070 > object.attribute.blank? 
    => true 
    
  3. vacío 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ío.

    2.2.2 :075 > object.attribute 
    => "some value" 
    2.2.2 :076 > object.attribute.blank? 
    => false 
    

Cuarto Método:.present?

  1. nulo valor es decir "nulo" almacenada en la base de datos

    2.2.2 :088 > object.attribute 
    => nil 
    2.2.2 :089 > object.attribute.present? 
    => false 
    
  2. vacía 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ío 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ío.

    2.2.2 :100 > object.attribute 
    => "some value" 
    2.2.2 :101 > object.attribute.present? 
    => true 
    

puede utilizar cualquiera de los cuatro dependiendo de la situación que enfrenta.

Gracias

Cuestiones relacionadas