Меня это тоже насторожило. Попытался найти пояснение, зачем нужен presence.
Оказывается, отличие в том, что он проверяет не только равенство nil, но и то, не является ли объект пустым в том или ином смысле.
Блин, меня достало уже писать так (как выше), особенно если конструкции сложные (и слова длинные). Приходится одно и то же дважды писать: сначала при присвоении, а потом — при проверке. Отстой ;/
А вот и нет. Допустим у вас была какая то запись в базе. Пришли данные из формы в которых поле лого было пустым. Вы сделали @theme.logo = params[:theme][:logo].presence И получилось что у вас затерлось поле лого в базе, которое по идее обновляться не должно было.
Если бы вы писали на чем нибудь другом, а не на Ruby, то не отличалось бы! Смотря конечно что вы ожидали бы получить.
В Ruby все объект, как мы знаем. Пустая строка(массив, хэш) такой же объект как и не пустая поэтому и та и другая преобразовываются в true, во многих других языках не так.
Поэтому нам порой приходится проверять объекты на их «пустоту». Метод blank?
Но вы ведь поняли что
region = params[:state].presence || params[:country].presence || 'US'
отличается от
region = params[:state] || params[:country] || 'US'
Потому что во втором случае params[:x] может быть только nil или false, а в первом может быть и пустым объектом.
После исправления у вас появились номера строк кода. Или они были, просто я их не заметил при первом прочтении? Мне кажется, что их лучше убрать — когда строк всего-то две-три (или даже одна), то они только запутывают.
Обзор новинок в Ruby on Rails