Rails: Como posso verificar se uma coluna tem um valor?
-
08-07-2019 - |
Pergunta
Como posso fazer isso?
<% for agent in @broker.agents %>
...
<% if agent.cell %><span class="cell-number">Cell: <%= agent.cell %></span><% end %>
...
<% end %>
Eu quero testar para ver se o agente tem um número de celular, e em caso afirmativo, mostrar o que está dentro da condicional. O que eu tenho atualmente não parece trabalho; ele apenas exibe "Cell:".
Os pensamentos?
Solução
Este é o que você pediu:
<% for agent in @broker.agents %>
<% unless agent.cell.blank? %>
<span class="cell-number">Cell: <%= agent.cell %></span>
<% end %>
<% end %>
A célula? método funciona se célula é nulo ou uma cadeia vazia. Rails adiciona funções semelhantes para todos os atributos do Active Record. Isto irá olhar um pouco mais agradável:
<% for agent in @broker.agents %>
<span class="cell-number">
Cell: <%= agent.cell? ? "none given" : agent.cell %>
</span>
<% end %>
O ponto de interrogação e cólon formar um rápido "se então:? Else" declaração. Há dois pontos de interrogação no código acima, porque é parte da célula nome do método? eo outro é uma parte do if / then / construção mais.
Outras dicas
Estou dando uma resposta muito detalhada a esta pergunta " Como posso verificar se uma coluna tem um valor? ".
Em primeiro lugar, é importante notar que um atributo pode ter quatro tipos de valores nele.
- nil valor i "nulo" armazenado no banco de dados
- esvaziar valor ou seja "" uma seqüência vazia com sem espaços
- esvaziar string com espaços "".
- valor presente no banco de dados ou seja um string não-vazia .
Aqui está o comportamento de todos os métodos atuais (o Ruby 2.2.2) que poderiam ser usados, neste caso, detalhes.
Primeiro Método: .empty?
-
Para nil value => Lança uma exceção
2.2.2 :037 > object.attribute => nil 2.2.2 :025 > object.attribute.empty? NoMethodError: undefined method `empty?' for nil:NilClass
-
Para esvaziar valor ou seja "" uma seqüência vazia com sem espaços
2.2.2 :037 > object.attribute => "" 2.2.2 :025 > object.attribute.empty? true
-
esvaziar string com espaços "".
2.2.2 :041 > object.attribute => " " 2.2.2 :042 > object.attribute.empty? => false
-
valor presente no banco de dados ou seja um string não-vazia .
2.2.2 :045 > object.attribute => "some value" 2.2.2 :046 > object.attribute.empty? => false
Segundo Método: .nil?
-
nil valor i "nulo" armazenado no banco de dados
2.2.2 :049 > object.attribute => nil 2.2.2 :050 > object.attribute.nil? => true
-
esvaziar valor ou seja "" uma seqüência vazia com sem espaços
2.2.2 :053 > object.attribute => "" 2.2.2 :054 > object.attribute.nil? => false
-
esvaziar string com espaços "".
2.2.2 :057 > object.attribute => " " 2.2.2 :058 > object.attribute.nil? => false
-
valor presente no banco de dados ou seja um string não-vazia .
2.2.2 :061 > object.attribute => "some value" 2.2.2 :062 > object.attribute.nil? => false
Terceiro Método: .blank?
-
nil valor i "nulo" armazenado no banco de dados
2.2.2 :065 > object.attribute => nil 2.2.2 :066 > object.attribute.blank? => true
-
esvaziar valor ou seja "" uma seqüência vazia com sem espaços
2.2.2 :069 > object.attribute => "" 2.2.2 :070 > object.attribute.blank? => true
-
esvaziar string com espaços "".
2.2.2 :073 > object.attribute => " " 2.2.2 :074 > object.attribute.blank? => true
-
valor presente no banco de dados ou seja um string não-vazia .
2.2.2 :075 > object.attribute => "some value" 2.2.2 :076 > object.attribute.blank? => false
Quarta Método: .present?
-
nil valor i "nulo" armazenado no banco de dados
2.2.2 :088 > object.attribute => nil 2.2.2 :089 > object.attribute.present? => false
-
esvaziar valor ou seja "" uma seqüência vazia com sem espaços
2.2.2 :092 > object.attribute => "" 2.2.2 :093 > object.attribute.present? => false
-
esvaziar string com espaços "".
2.2.2 :096 > object.attribute => " " 2.2.2 :097 > object.attribute.present? => false
-
valor presente no banco de dados ou seja um string não-vazia .
2.2.2 :100 > object.attribute => "some value" 2.2.2 :101 > object.attribute.present? => true
Você pode usar qualquer um dos quatro, dependendo da situação que você enfrenta.
Graças
if !agent.cell.blank?
Ele funciona.
agent.cell? parece funcionar o mesmo que agent.cell.blank? em RoR.
<% @broker.agents.each do |agent| %>
...
<% unless agent.cell.empty? %>
<span class="cell-number">Cell: <%= agent.cell %></span>
<% end %>
...
<% end %>
I encontrar o uso de #each, unless
e cell.empty?
para ser mais legível e mais fácil de entender à primeira vista.