Rails: Как проверить, имеет ли столбец значение? - PullRequest
11 голосов
/ 19 ноября 2008

Как мне это сделать?

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

Я хочу проверить, есть ли у агента номер ячейки, и если да, показать, что находится внутри условия. То, что у меня есть сейчас, похоже, не работает; он просто отображает "Cell:".

Мысли

Ответы [ 5 ]

14 голосов
/ 19 ноября 2008

Это то, что вы просили:

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

Клетка? Метод работает независимо от того, является ли ячейка нулевой или пустой строкой. Rails добавляет аналогичные функции для всех атрибутов ActiveRecord. Это будет выглядеть немного лучше:

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

Знак вопроса и двоеточие образуют быстрое утверждение «если? Тогда: еще». В приведенном выше коде есть два знака вопроса, потому что один является частью ячейки имени метода? а другой является частью конструкции if / then / else.

8 голосов
/ 29 августа 2016

Я даю очень подробный ответ на этот вопрос " Как проверить, имеет ли столбец значение? ".

Прежде всего, важно отметить, что атрибут может иметь четыре вида значений.

  1. ноль значение, т. Е. "Ноль", хранящийся в базе данных
  2. пусто значение, т. Е. "" Пустая строка с без пробелов
  3. пусто строка с пробелами"".
  4. значение присутствует в базе данных, т.е. непустая строка .

Вот подробное поведение всех существующих методов (Ruby 2.2.2), которые могут быть использованы в этом случае.

Первый метод: .empty?

  1. Для ноль значение => Выдает исключение

    2.2.2 :037 > object.attribute
    => nil
    2.2.2 :025 > object.attribute.empty?
    NoMethodError: undefined method `empty?' for nil:NilClass
    
  2. Для пусто значение, т.е. "" пустая строка с без пробелов

    2.2.2 :037 > object.attribute
    => ""
    2.2.2 :025 > object.attribute.empty?
    true
    
  3. пусто строка с пробелами"".

    2.2.2 :041 > object.attribute
    => " " 
    2.2.2 :042 > object.attribute.empty?
    => false
    
  4. значение присутствует в базе данных, т.е. непустая строка .

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

Второй метод: .nil?

  1. ноль значение, т. Е. "Ноль", хранящийся в базе данных

    2.2.2 :049 > object.attribute
     => nil 
    2.2.2 :050 > object.attribute.nil?
     => true
    
  2. пусто значение т.е. "" пустая строка с без пробелов

    2.2.2 :053 > object.attribute
     => "" 
    2.2.2 :054 > object.attribute.nil?
     => false 
    
  3. пусто строка с пробелами"".

    2.2.2 :057 > object.attribute
     => " " 
    2.2.2 :058 > object.attribute.nil?
     => false 
    
  4. значение присутствует в базе данных, т.е. непустая строка .

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

Третий метод: .blank?

  1. ноль значение, т. Е. "Ноль", хранящийся в базе данных

    2.2.2 :065 > object.attribute
     => nil 
    2.2.2 :066 > object.attribute.blank?
     => true
    
  2. пусто значение т.е. "" пустая строка с без пробелов

    2.2.2 :069 > object.attribute
     => "" 
    2.2.2 :070 > object.attribute.blank?
     => true 
    
  3. пусто строка с пробелами"".

    2.2.2 :073 > object.attribute
     => " " 
    2.2.2 :074 > object.attribute.blank?
     => true 
    
  4. значение присутствует в базе данных, т.е. непустая строка .

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

Четвертый метод: .present?

  1. ноль значение, т.е. "ноль", хранящийся в базе данных

    2.2.2 :088 > object.attribute
     => nil 
    2.2.2 :089 > object.attribute.present?
     => false
    
  2. пусто значение т.е. "" пустая строка с без пробелов

    2.2.2 :092 > object.attribute
     => "" 
    2.2.2 :093 > object.attribute.present?
     => false
    
  3. пусто строка с пробелами"".

    2.2.2 :096 > object.attribute
     => " " 
    2.2.2 :097 > object.attribute.present?
     => false 
    
  4. значение присутствует в базе данных, т.е. непустая строка .

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

Вы можете использовать любой из четырех в зависимости от ситуации, с которой вы столкнулись.

Спасибо

5 голосов
/ 19 ноября 2008
if !agent.cell.blank?

Работает.

1 голос
/ 20 ноября 2008

agent.cell? кажется, работает так же, как agent.cell.blank? в RoR.

0 голосов
/ 21 ноября 2008
<% @broker.agents.each do |agent| %>
  ...
  <% unless agent.cell.empty? %>
    <span class="cell-number">Cell: <%= agent.cell %></span>
  <% end %>
  ...
<% end %>

Я считаю использование #each, unless и cell.empty? более читабельным и понятным на первый взгляд.

...