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?

Foi útil?

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.

  1. nil valor i "nulo" armazenado no banco de dados
  2. esvaziar valor ou seja "" uma seqüência vazia com sem espaços
  3. esvaziar string com espaços "".
  4. 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?

  1. 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
    
  2. 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
    
  3. esvaziar string com espaços "".

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

  1. nil valor i "nulo" armazenado no banco de dados

    2.2.2 :049 > object.attribute
     => nil 
    2.2.2 :050 > object.attribute.nil?
     => true
    
  2. 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 
    
  3. esvaziar string com espaços "".

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

  1. nil valor i "nulo" armazenado no banco de dados

    2.2.2 :065 > object.attribute
     => nil 
    2.2.2 :066 > object.attribute.blank?
     => true
    
  2. 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 
    
  3. esvaziar string com espaços "".

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

  1. nil valor i "nulo" armazenado no banco de dados

    2.2.2 :088 > object.attribute
     => nil 
    2.2.2 :089 > object.attribute.present?
     => false
    
  2. 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
    
  3. esvaziar string com espaços "".

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top