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?

Était-ce utile?

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.

  1. nil valeur c.-à-d. "néant" stocké dans la base de données
  2. vide valeur i.e """ une chaîne vide avec sans espaces
  3. vide chaîne avec des espaces " ".
  4. La
  5. 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?

  1. 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
    
  2. 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
    
  3. vide chaîne avec des espaces " ".

    2.2.2 :041 > object.attribute
    => " " 
    2.2.2 :042 > object.attribute.empty?
    => false
    
  4. La
  5. 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?

  1. 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
    
  2. 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 
    
  3. vide chaîne avec des espaces " ".

    2.2.2 :057 > object.attribute
     => " " 
    2.2.2 :058 > object.attribute.nil?
     => false 
    
  4. La
  5. 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?

  1. 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
    
  2. 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 
    
  3. vide chaîne avec des espaces " ".

    2.2.2 :073 > object.attribute
     => " " 
    2.2.2 :074 > object.attribute.blank?
     => true 
    
  4. La
  5. 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?

  1. 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
    
  2. 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
    
  3. vide chaîne avec des espaces " ".

    2.2.2 :096 > object.attribute
     => " " 
    2.2.2 :097 > object.attribute.present?
     => false 
    
  4. La
  5. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top