2008-11-19 17 views
10

Jak mogę to zrobić?Szyny: Jak sprawdzić, czy kolumna ma wartość?

<% for agent in @broker.agents %> 
    ... 
    <% if agent.cell %><span class="cell-number">Cell: <%= agent.cell %></span><% end %> 
    ... 
<% end %> 

Chcę przetestować, aby sprawdzić, czy agent ma numer komórki, a jeśli tak, wyświetlić, co jest wewnątrz warunkowe. To, co mam obecnie, wydaje się nie działać; po prostu wyświetla "Cell:".

Myśli?

Odpowiedz

13

To co prosiłeś:

<% for agent in @broker.agents %> 
    <% unless agent.cell.blank? %> 
    <span class="cell-number">Cell: <%= agent.cell %></span> 
    <% end %> 
<% end %> 

Komórka? Metoda działa niezależnie od tego, czy komórka jest pusta, czy pusty. Railsy dodają podobne funkcje dla wszystkich atrybutów ActiveRecord. Będzie to wyglądać nieco ładniej:

<% for agent in @broker.agents %> 
    <span class="cell-number"> 
    Cell: <%= agent.cell? ? "none given" : agent.cell %> 
    </span> 
<% end %> 

Znak zapytania i dwukropek tworzą szybkie wyrażenie "jeśli ?, to: else". W powyższym kodzie są dwa znaki zapytania, ponieważ jeden jest częścią komórki z nazwą metody? a drugi jest częścią konstrukcji if/then/else.

+1

Możesz to uprościć, wykonując '<% = agent.cell || "none given"%> ' –

4
if !agent.cell.blank? 

Działa.

+2

Można rozważyć „chyba agent.cell.blank?”, Które niektórzy assert jest „więcej Ruby-owski” –

+0

używam chyba chyba agent.cell.blank ponieważ podwójne negatywy są niesamowite. – FlySwat

+2

Możesz również użyć 'jeśli agent.cell.present?' #present? zwraca przeciwieństwo #blank? – paradoja

1

agent.cell? wydaje się działać tak samo jak agent.cell.blank? w RoR.

+0

Wygląda na to, że nie ma go w szynach 3.2.6 (lub Ruby 1.9) – Ben

0
<% @broker.agents.each do |agent| %> 
    ... 
    <% unless agent.cell.empty? %> 
    <span class="cell-number">Cell: <%= agent.cell %></span> 
    <% end %> 
    ... 
<% end %> 

znaleźć zastosowanie #each, unless i cell.empty? być bardziej czytelne i łatwiejsze do zrozumienia na pierwszy rzut oka.

4

Daję bardzo szczegółową odpowiedź na to pytanie "Jak sprawdzić, czy kolumna ma wartość?".

Przede wszystkim należy zauważyć, że atrybut może zawierać cztery rodzaje wartości.

  1. nil wartość tj "nil" przechowywane w bazie danych
  2. pusty wartość tj "" pusty łańcuch z bez spacji
  3. pusty smyczkowych spacjami "".
  4. wartość obecna w bazie danych, tj. niepusty ciąg znaków.

Oto szczegóły zachowania wszystkich obecnych metod (Ruby 2.2.2), które mogą być użyte w tym przypadku.

Pierwsza metoda:.empty?

  1. Dla nil value => Zgłasza wyjątek

    2.2.2 :037 > object.attribute 
    => nil 
    2.2.2 :025 > object.attribute.empty? 
    NoMethodError: undefined method `empty?' for nil:NilClass 
    
  2. Dla pustym wartości tj "" pustym ciągiem z bez spacji

    2.2.2 :037 > object.attribute 
    => "" 
    2.2.2 :025 > object.attribute.empty? 
    true 
    
  3. pusty ciąg spacjami "".

    2.2.2 :041 > object.attribute 
    => " " 
    2.2.2 :042 > object.attribute.empty? 
    => false 
    
  4. wartość występuje w bazie danych tj o niepusty ciąg.

    2.2.2 :045 > object.attribute 
    => "some value" 
    2.2.2 :046 > object.attribute.empty? 
    => false 
    

Druga metoda:.nil?

  1. nil wartość tj "nil" przechowywane w bazie danych

    2.2.2 :049 > object.attribute 
    => nil 
    2.2.2 :050 > object.attribute.nil? 
    => true 
    
  2. pusty wartość tj "" pusty łańcuch z bez spacji

    2.2.2 :053 > object.attribute 
    => "" 
    2.2.2 :054 > object.attribute.nil? 
    => false 
    
  3. pusty strunowe ze spacjami "".

    2.2.2 :057 > object.attribute 
    => " " 
    2.2.2 :058 > object.attribute.nil? 
    => false 
    
  4. wartość występuje w bazie danych tj o niepusty ciąg.

    2.2.2 :061 > object.attribute 
    => "some value" 
    2.2.2 :062 > object.attribute.nil? 
    => false 
    

Trzecia metoda:.blank?

  1. nil wartość tj "nil" przechowywane w bazie danych

    2.2.2 :065 > object.attribute 
    => nil 
    2.2.2 :066 > object.attribute.blank? 
    => true 
    
  2. pusty wartość i.E "" pusty łańcuch z bez spacji

    2.2.2 :069 > object.attribute 
    => "" 
    2.2.2 :070 > object.attribute.blank? 
    => true 
    
  3. pusty strunowe ze spacjami "".

    2.2.2 :073 > object.attribute 
    => " " 
    2.2.2 :074 > object.attribute.blank? 
    => true 
    
  4. wartość występuje w bazie danych tj o niepusty ciąg.

    2.2.2 :075 > object.attribute 
    => "some value" 
    2.2.2 :076 > object.attribute.blank? 
    => false 
    

Czwarty sposób:.present?

  1. nil wartość tj "nil" przechowywane w bazie danych

    2.2.2 :088 > object.attribute 
    => nil 
    2.2.2 :089 > object.attribute.present? 
    => false 
    
  2. pusty wartość tj "" pusty łańcuch z bez spacji

    2.2.2 :092 > object.attribute 
    => "" 
    2.2.2 :093 > object.attribute.present? 
    => false 
    
  3. pusty strunowe ze spacjami "".

    2.2.2 :096 > object.attribute 
    => " " 
    2.2.2 :097 > object.attribute.present? 
    => false 
    
  4. wartość występuje w bazie danych tj o niepusty ciąg.

    2.2.2 :100 > object.attribute 
    => "some value" 
    2.2.2 :101 > object.attribute.present? 
    => true 
    

Można użyć jednej z czterech w zależności od sytuacji w twarz.

Dzięki

Powiązane problemy