Как стать автором
Обновить

Комментарии 26

плохой пример про presence.

region = params[:state].presence || params[:country].presence || 'US'

ничем не отличается от

region = params[:state] || params[:country] || 'US'
Меня это тоже насторожило. Попытался найти пояснение, зачем нужен presence.
Оказывается, отличие в том, что он проверяет не только равенство nil, но и то, не является ли объект пустым в том или ином смысле.

См. api.rubyonrails.org/classes/Object.html#M000013, комментарий к следующему за ним методу present?(), который вызывается методом presence(), и в особенности api.rubyonrails.org/classes/Object.html#M000011 — rdoc для blank?(), где и описывается логика: «An object is blank if it‘s false, empty, or a whitespace string. For example, "", " ", nil, [], and {} are blank.»
сейчас дополню, спасибо)
Автор, добавьте пояснение по этому поводу в статью. Иначе любой Рубист сделает стойку на это ;)
Кажется все после этого идут в rdoc и внимательно читают, зачем нужен этот presence…
Я так понял, что это и есть решение избыточности кода а-ля: a = b if b.present?
То есть теперь можно писать a = b.presence или я опять что-то путаю?
видимо путаешь) потому что если b не будет, то он вернет nil и a будет равно nil.
Блин, меня достало уже писать так (как выше), особенно если конструкции сложные (и слова длинные). Приходится одно и то же дважды писать: сначала при присвоении, а потом — при проверке. Отстой ;/
ДА ДА ДА. Например @theme.logo = params[:theme][:logo] if params[:theme][:logo]
ну так presence для этого и сделан, разве нет?

@theme.logo = params[:theme][:logo].presence

если есть то поставит лого, если нет то будет nil
А вот и нет. Допустим у вас была какая то запись в базе. Пришли данные из формы в которых поле лого было пустым. Вы сделали @theme.logo = params[:theme][:logo].presence И получилось что у вас затерлось поле лого в базе, которое по идее обновляться не должно было.
Наверное, если оно пришло пустое, то так и надо:)
Может быть, поможет конструкция «a ||= b»?
Вы что сударь.
А, ну да, здесь присвоение выполнится, если a не существует, а не b. Извиняюсь.
Если бы вы писали на чем нибудь другом, а не на Ruby, то не отличалось бы! Смотря конечно что вы ожидали бы получить.

В Ruby все объект, как мы знаем. Пустая строка(массив, хэш) такой же объект как и не пустая поэтому и та и другая преобразовываются в true, во многих других языках не так.
Поэтому нам порой приходится проверять объекты на их «пустоту». Метод blank?

present? = !blank?
{}[:something] == nil — вот что я имел ввиду

(nil || nil || 'US') == 'US'
Да, я прекрасно понял.

Но вы ведь поняли что
region = params[:state].presence || params[:country].presence || 'US'
отличается от
region = params[:state] || params[:country] || 'US'

Потому что во втором случае params[:x] может быть только nil или false, а в первом может быть и пустым объектом.

Не бывает блин никаких пустых объектов. presence служит для дропанья пустых строк.

("" || "" || «US») == ""

("".presence || "".presence || «US») == «US»

Вот такой пример более синтетический, но дает более правильное представление о presence, чем пример с params.
Сударь вы ошибаетесь. Пройдите еще раз по ссылочке и посмотрите что такое presence, blank? и present? и их сорцы.

[] — пустой массив
{} — пустой хэш

[].presence #=> nil
{}.presence #=> nil
false.presence #=> nil
''.presence #=> nil
CanCan тоже очень понравился
Ребята, ну мы ведь договаривались не писать эти штуки: «Текст подготовлен в редакторе...». Ну что ж вы так?

А за статью спасибо :)
не заметил, оно автоматом как-то добавилось — я даже внимания не обратил)
После исправления у вас появились номера строк кода. Или они были, просто я их не заметил при первом прочтении? Мне кажется, что их лучше убрать — когда строк всего-то две-три (или даже одна), то они только запутывают.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории