Rotaie: come posso verificare se una colonna ha un valore?
-
08-07-2019 - |
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?
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.
- zero vale a dire " zero " memorizzato nel database
- vuoto vale a dire " " una stringa vuota con nessuno spazio
- vuoto stringa con spazi " & Quot;.
- 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?
-
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
-
Per valore vuoto ovvero " " una stringa vuota con nessuno spazio
2.2.2 :037 > object.attribute => "" 2.2.2 :025 > object.attribute.empty? true
vuoto stringa con spazi " & Quot;.
2.2.2 :041 > object.attribute => " " 2.2.2 :042 > object.attribute.empty? => false
-
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?
zero vale a dire " zero " memorizzato nel database
2.2.2 :049 > object.attribute => nil 2.2.2 :050 > object.attribute.nil? => true
vuoto vale a dire " " una stringa vuota con nessuno spazio
2.2.2 :053 > object.attribute => "" 2.2.2 :054 > object.attribute.nil? => false
vuoto stringa con spazi " & Quot;.
2.2.2 :057 > object.attribute => " " 2.2.2 :058 > object.attribute.nil? => false
-
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?
zero vale a dire " zero " memorizzato nel database
2.2.2 :065 > object.attribute => nil 2.2.2 :066 > object.attribute.blank? => true
vuoto vale a dire " " una stringa vuota con nessuno spazio
2.2.2 :069 > object.attribute => "" 2.2.2 :070 > object.attribute.blank? => true
vuoto stringa con spazi " & Quot;.
2.2.2 :073 > object.attribute => " " 2.2.2 :074 > object.attribute.blank? => true
-
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?
zero vale a dire " zero " memorizzato nel database
2.2.2 :088 > object.attribute => nil 2.2.2 :089 > object.attribute.present? => false
vuoto vale a dire " " una stringa vuota con nessuno spazio
2.2.2 :092 > object.attribute => "" 2.2.2 :093 > object.attribute.present? => false
vuoto stringa con spazi " & Quot;.
2.2.2 :096 > object.attribute => " " 2.2.2 :097 > object.attribute.present? => false
-
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.