Проблема между разве что .blank?и если - PullRequest
2 голосов
/ 23 декабря 2011

Взгляните на следующие фрагменты кода. Имейте в виду, что @product.name пусто.

Код A

<% if @product.name %>
  <div class="bonus">
    <h4>Bonus</h4>
    <%= @product.name %>                
  </div>
<% end %>   


Код B

<% unless @product.name.blank? %>
  <div class="bonus">
    <h4>Bonus</h4>
    <%= @product.name %>                
  </div>
<% end %>   


Из моего понимания того, как использовать if и unless (благодаря этой статье), оба Код A и B должна иметь точно такую ​​же функцию, за исключением того, что код A является правильным способом сделать это в соответствии с лучшими практиками.

Проблема в том, что код A На дисплее генерируется тег <h4>Bonus</h4>, тогда как Код B - нет!

Как это возможно?

Ответы [ 5 ]

4 голосов
/ 23 декабря 2011

Это потому, что в Ruby пустая строка имеет вид true .

Только false и nil имеют значение false, все остальное верно в Ruby, включая пустую строку (в отличие от языков, таких как Perl или PHP).

Вот почему Rails ввел blank? (а позже и его противоположность present?)

Из исходного кода Rails:

# An object is blank if it's false, empty, or a whitespace string.
# For example, "", "   ", +nil+, [], and {} are all blank.
#
# This simplifies:
#
#   if address.nil? || address.empty?
#
# ...to:
#
#   if address.blank?
def blank?
  respond_to?(:empty?) ? empty? : !self
end

# An object is present if it's not <tt>blank?</tt>.
def present?
  !blank?
end
3 голосов
/ 23 декабря 2011

Они не одинаковы.

  • blank? проверяет nil и пробел.
  • if проверка на правдивость. Строка с единственным пробелом, включая пустую строку, является достоверной.

Эквивалент if оператора будет if @product.name.present?

2 голосов
/ 23 декабря 2011

В Ruby только nil и false считаются ложными значениями. Таким образом, если условие в условии if не nil или false, код внутри будет выполнен. В вашем примере A @product.name - это пустая строка, которая рассматривается Ruby как истинное значение. Итак, код выполнен.

С другой стороны, существует метод blank?, представленный Rails. Возвращает false для:

  • nil
  • false
  • '' (пустая строка)
  • ' ' (строка с пробелами)
  • {} (пустой хэш)
  • [] (пустой массив)

Вот почему вы получаете false от blank? за пустое @product.name.

И наоборот для blank? это present? метод.

2 голосов
/ 23 декабря 2011

unless X.blank? равно , а не , противоположное if X!

@product.name верно, если оно не установлено на false или nil.Если он содержит пустую строку, поток программы все равно войдет в блок if, а <%= @product.name %> выведет пустую строку.

.blank? верно для пустых строк или строк,содержать только пробелы.

0 голосов
/ 23 декабря 2011
puts 'Empty string is truthy' if ''
#=> Empty string is truthy

Тем не менее, вы можете сделать:

<% if @product.name? %>
<% if @product.name.present? %>
<% unless @product.name.blank? %>

С вопросительным знаком в конце. Это означает, что «если @ product.name присутствует» (<=> не является пустым)

Мои предпочтения идут к первому (@product.name?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...