Rails: Comment vérifier si une colonne a une valeur?
-
08-07-2019 - |
Question
Comment puis-je accomplir cela?
<% for agent in @broker.agents %>
...
<% if agent.cell %><span class="cell-number">Cell: <%= agent.cell %></span><% end %>
...
<% end %>
Je souhaite vérifier si l'agent a un numéro de cellule et, le cas échéant, afficher le contenu de la condition. Ce que j'ai actuellement ne semble pas fonctionner; il affiche simplement "Cell:".
Pensées?
La solution
Voici ce que vous avez demandé:
<% for agent in @broker.agents %>
<% unless agent.cell.blank? %>
<span class="cell-number">Cell: <%= agent.cell %></span>
<% end %>
<% end %>
La cellule? La méthode fonctionne si la cellule est nulle ou une chaîne vide. Rails ajoute des fonctions similaires pour tous les attributs ActiveRecord. Cela aura l'air un peu plus agréable:
<% for agent in @broker.agents %>
<span class="cell-number">
Cell: <%= agent.cell? ? "none given" : agent.cell %>
</span>
<% end %>
Le point d'interrogation et les deux points forment un "Si? then: else " déclaration. Il y a deux points d'interrogation dans le code ci-dessus car l'un fait partie de la cellule du nom de la méthode? et l’autre fait partie de la construction if / then / else.
Autres conseils
Je donne une réponse très détaillée à cette question " Comment puis-je vérifier si une colonne a une valeur? ".
Tout d'abord, il est important de noter qu'un attribut peut contenir quatre types de valeurs.
- nil valeur c.-à-d. "néant" stocké dans la base de données
- vide valeur i.e """ une chaîne vide avec sans espaces
- vide chaîne avec des espaces " ". La
- valeur présente dans la base de données est une chaîne non vide .
Voici le comportement détaillé de toutes les méthodes actuelles (Ruby 2.2.2) qui pourraient être utilisées dans ce cas.
Première méthode: .empty?
-
Pour rien , value = > Lance une exception
2.2.2 :037 > object.attribute => nil 2.2.2 :025 > object.attribute.empty? NoMethodError: undefined method `empty?' for nil:NilClass
-
Pour la valeur vide , c.-à-d. " " une chaîne vide avec sans espaces
2.2.2 :037 > object.attribute => "" 2.2.2 :025 > object.attribute.empty? true
-
vide chaîne avec des espaces " ".
2.2.2 :041 > object.attribute => " " 2.2.2 :042 > object.attribute.empty? => false
La -
valeur présente dans la base de données est une chaîne non vide .
2.2.2 :045 > object.attribute => "some value" 2.2.2 :046 > object.attribute.empty? => false
Deuxième méthode: .nil?
-
néant , c'est-à-dire "néant" stocké dans la base de données
2.2.2 :049 > object.attribute => nil 2.2.2 :050 > object.attribute.nil? => true
-
vide valeur i.e "" une chaîne vide avec sans espaces
2.2.2 :053 > object.attribute => "" 2.2.2 :054 > object.attribute.nil? => false
-
vide chaîne avec des espaces " ".
2.2.2 :057 > object.attribute => " " 2.2.2 :058 > object.attribute.nil? => false
La -
valeur présente dans la base de données est une chaîne non vide .
2.2.2 :061 > object.attribute => "some value" 2.2.2 :062 > object.attribute.nil? => false
Troisième méthode: .blank?
-
néant , c'est-à-dire "néant" stocké dans la base de données
2.2.2 :065 > object.attribute => nil 2.2.2 :066 > object.attribute.blank? => true
-
vide valeur i.e "" une chaîne vide avec sans espaces
2.2.2 :069 > object.attribute => "" 2.2.2 :070 > object.attribute.blank? => true
-
vide chaîne avec des espaces " ".
2.2.2 :073 > object.attribute => " " 2.2.2 :074 > object.attribute.blank? => true
La -
valeur présente dans la base de données est une chaîne non vide .
2.2.2 :075 > object.attribute => "some value" 2.2.2 :076 > object.attribute.blank? => false
Quatrième méthode: .present?
-
néant , c'est-à-dire "néant" stocké dans la base de données
2.2.2 :088 > object.attribute => nil 2.2.2 :089 > object.attribute.present? => false
-
vide valeur i.e "" une chaîne vide avec sans espaces
2.2.2 :092 > object.attribute => "" 2.2.2 :093 > object.attribute.present? => false
-
vide chaîne avec des espaces " ".
2.2.2 :096 > object.attribute => " " 2.2.2 :097 > object.attribute.present? => false
La -
valeur présente dans la base de données est une chaîne non vide .
2.2.2 :100 > object.attribute => "some value" 2.2.2 :101 > object.attribute.present? => true
Vous pouvez utiliser l'un des quatre selon la situation à laquelle vous êtes confronté.
Merci
if !agent.cell.blank?
Cela fonctionne.
agent.cell? semble fonctionner de la même façon 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 %>
Je trouve l'utilisation de #each, à moins que
et cell.empty?
soit plus lisible et plus facile à comprendre à première vue.