Rails: Wie kann ich überprüfen, ob eine Spalte einen Wert hat?
-
08-07-2019 - |
Frage
Wie kann ich das erreichen?
<% for agent in @broker.agents %>
...
<% if agent.cell %><span class="cell-number">Cell: <%= agent.cell %></span><% end %>
...
<% end %>
Ich möchte zu sehen, testen, ob der Agent eine Zellzahl hat, und wenn ja, zeigen, was innerhalb des bedingten ist. Was ich habe, scheint derzeit nicht zu arbeiten; es zeigt nur "Cell:".
Die Gedanken?
Lösung
Dies ist, was Sie gefragt:
<% for agent in @broker.agents %>
<% unless agent.cell.blank? %>
<span class="cell-number">Cell: <%= agent.cell %></span>
<% end %>
<% end %>
Die Zelle? Methode funktioniert, ob Zelle gleich Null oder eine leere Zeichenfolge ist. Rails fügt ähnliche Funktionen für alle Active Attribute. Dies wird ein wenig schöner aussehen:
<% for agent in @broker.agents %>
<span class="cell-number">
Cell: <%= agent.cell? ? "none given" : agent.cell %>
</span>
<% end %>
Das Fragezeichen und Doppelpunkt schnell bilden „wenn dann:? Else“ Anweisung. Es gibt zwei Fragezeichen im Code oben, weil ein Teil der Methodenname Zelle ist? und der andere ist ein Teil der if / then / else Konstruktion.
Andere Tipps
ich auf diese Frage eine sehr ausführliche Antwort geben werde „ Wie kann ich überprüfen, ob eine Spalte einen Wert hat? “.
Zunächst einmal ist es wichtig zu beachten, dass ein Attribut vier Arten von Werten in ihm haben kann.
- nil Wert heißt "Null" in der Datenbank gespeichert
- leer Wert heißt "" eine leere Zeichenfolge mit keine Leerzeichen
- leer string mit Leerzeichen "".
- Wert in Datenbank d.h eine nicht leere Zeichenfolge .
Hier ist das Detail Verhalten aller vorliegenden Verfahren (Rubin 2.2.2), die in diesem Fall verwendet werden könnten.
Erste Methode: .empty?
-
nil value => Löst eine Ausnahme aus
2.2.2 :037 > object.attribute => nil 2.2.2 :025 > object.attribute.empty? NoMethodError: undefined method `empty?' for nil:NilClass
-
leer Wert heißt "" eine leere Zeichenfolge mit keine Leerzeichen
2.2.2 :037 > object.attribute => "" 2.2.2 :025 > object.attribute.empty? true
-
leer string mit Leerzeichen "".
2.2.2 :041 > object.attribute => " " 2.2.2 :042 > object.attribute.empty? => false
-
Wert in Datenbank d.h eine nicht leere Zeichenfolge .
2.2.2 :045 > object.attribute => "some value" 2.2.2 :046 > object.attribute.empty? => false
Zweite Methode: .nil?
-
nil Wert heißt "Null" in der Datenbank gespeichert
2.2.2 :049 > object.attribute => nil 2.2.2 :050 > object.attribute.nil? => true
-
leer Wert heißt "" eine leere Zeichenfolge mit keine Leerzeichen
2.2.2 :053 > object.attribute => "" 2.2.2 :054 > object.attribute.nil? => false
-
leer string mit Leerzeichen "".
2.2.2 :057 > object.attribute => " " 2.2.2 :058 > object.attribute.nil? => false
-
Wert in Datenbank d.h eine nicht leere Zeichenfolge .
2.2.2 :061 > object.attribute => "some value" 2.2.2 :062 > object.attribute.nil? => false
Dritte Methode: .blank?
-
nil Wert heißt "Null" in der Datenbank gespeichert
2.2.2 :065 > object.attribute => nil 2.2.2 :066 > object.attribute.blank? => true
-
leer Wert heißt "" eine leere Zeichenfolge mit keine Leerzeichen
2.2.2 :069 > object.attribute => "" 2.2.2 :070 > object.attribute.blank? => true
-
leer string mit Leerzeichen "".
2.2.2 :073 > object.attribute => " " 2.2.2 :074 > object.attribute.blank? => true
-
Wert in Datenbank d.h eine nicht leere Zeichenfolge .
2.2.2 :075 > object.attribute => "some value" 2.2.2 :076 > object.attribute.blank? => false
Viertes Verfahren: .present?
-
nil Wert heißt "Null" in der Datenbank gespeichert
2.2.2 :088 > object.attribute => nil 2.2.2 :089 > object.attribute.present? => false
-
leer Wert heißt "" eine leere Zeichenfolge mit keine Leerzeichen
2.2.2 :092 > object.attribute => "" 2.2.2 :093 > object.attribute.present? => false
-
leer string mit Leerzeichen "".
2.2.2 :096 > object.attribute => " " 2.2.2 :097 > object.attribute.present? => false
-
Wert in Datenbank d.h eine nicht leere Zeichenfolge .
2.2.2 :100 > object.attribute => "some value" 2.2.2 :101 > object.attribute.present? => true
Sie können entweder von den vier verwenden, abhängig von der Situation, die Sie stellen.
Danke
if !agent.cell.blank?
Es funktioniert.
agent.cell? scheint die gleichen wie agent.cell.blank zu arbeiten? in RoR.
<% @broker.agents.each do |agent| %>
...
<% unless agent.cell.empty? %>
<span class="cell-number">Cell: <%= agent.cell %></span>
<% end %>
...
<% end %>
Ich finde die Verwendung von #each, unless
und cell.empty?
werden besser lesbar und leichter auf den ersten Blick zu verstehen.