Domanda

Come posso farlo?

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

Voglio verificare se l'agente ha un numero di cella e, in tal caso, visualizzare cosa c'è dentro il condizionale. Quello che ho attualmente non sembra funzionare; mostra solo " Cella: " ;.

Pensieri?

È stato utile?

Soluzione

Questo è quello che hai chiesto:

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

La cella? Il metodo funziona se la cella è nulla o una stringa vuota. Rails aggiunge funzioni simili per tutti gli attributi di ActiveRecord. Questo sembrerà un po 'più bello:

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

Il punto interrogativo e i due punti formano un rapido "se? quindi: else " dichiarazione. Ci sono due punti interrogativi nel codice sopra perché uno fa parte della cella del nome del metodo? e l'altro fa parte della costruzione if / then / else.

Altri suggerimenti

Sto dando una risposta molto dettagliata a questa domanda " Come posso verificare se una colonna ha un valore? " ;.

Prima di tutto, è importante notare che un attributo può contenere quattro tipi di valori.

  1. zero vale a dire " zero " memorizzato nel database
  2. vuoto vale a dire " " una stringa vuota con nessuno spazio
  3. vuoto stringa con spazi " & Quot;.
  4. valore presente nel database, ovvero una stringa non vuota .

Ecco il comportamento dettagliato di tutti i metodi attuali (Ruby 2.2.2) che potrebbero essere usati in questo caso.

Primo metodo: .empty?

  1. Per zero value = > Genera un'eccezione

    2.2.2 :037 > object.attribute
    => nil
    2.2.2 :025 > object.attribute.empty?
    NoMethodError: undefined method `empty?' for nil:NilClass
    
  2. Per valore vuoto ovvero " " una stringa vuota con nessuno spazio

    2.2.2 :037 > object.attribute
    => ""
    2.2.2 :025 > object.attribute.empty?
    true
    
  3. vuoto stringa con spazi " & Quot;.

    2.2.2 :041 > object.attribute
    => " " 
    2.2.2 :042 > object.attribute.empty?
    => false
    
  4. valore presente nel database, ovvero una stringa non vuota .

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

Secondo metodo: .nil?

  1. zero vale a dire " zero " memorizzato nel database

    2.2.2 :049 > object.attribute
     => nil 
    2.2.2 :050 > object.attribute.nil?
     => true
    
  2. vuoto vale a dire " " una stringa vuota con nessuno spazio

    2.2.2 :053 > object.attribute
     => "" 
    2.2.2 :054 > object.attribute.nil?
     => false 
    
  3. vuoto stringa con spazi " & Quot;.

    2.2.2 :057 > object.attribute
     => " " 
    2.2.2 :058 > object.attribute.nil?
     => false 
    
  4. valore presente nel database, ovvero una stringa non vuota .

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

Terzo metodo: .blank?

  1. zero vale a dire " zero " memorizzato nel database

    2.2.2 :065 > object.attribute
     => nil 
    2.2.2 :066 > object.attribute.blank?
     => true
    
  2. vuoto vale a dire " " una stringa vuota con nessuno spazio

    2.2.2 :069 > object.attribute
     => "" 
    2.2.2 :070 > object.attribute.blank?
     => true 
    
  3. vuoto stringa con spazi " & Quot;.

    2.2.2 :073 > object.attribute
     => " " 
    2.2.2 :074 > object.attribute.blank?
     => true 
    
  4. valore presente nel database, ovvero una stringa non vuota .

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

Quarto metodo: .present?

  1. zero vale a dire " zero " memorizzato nel database

    2.2.2 :088 > object.attribute
     => nil 
    2.2.2 :089 > object.attribute.present?
     => false
    
  2. vuoto vale a dire " " una stringa vuota con nessuno spazio

    2.2.2 :092 > object.attribute
     => "" 
    2.2.2 :093 > object.attribute.present?
     => false
    
  3. vuoto stringa con spazi " & Quot;.

    2.2.2 :096 > object.attribute
     => " " 
    2.2.2 :097 > object.attribute.present?
     => false 
    
  4. valore presente nel database, ovvero una stringa non vuota .

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

Puoi usare uno dei quattro a seconda della situazione che stai affrontando.

Grazie

if !agent.cell.blank?

Funziona.

agent.cell? sembra funzionare come agent.cell.blank? in RoR.

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

Trovo l'uso di #each, a meno che e cell.empty? siano più leggibili e più facili da capire a prima vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top