blank? e present? em Rails

Dicas - 29/Jul/2019 - por Henrique Morato

Temos diversos métodos em Ruby para validar diferentes tipos de objetos, como empty? ou includes?, que podem ser usados em Array. Em Rails temos os métodos blank? e present? definidos no ActiveSupport.

Esses métodos podem ser usados para resolver problemas quando o objeto X responde somente a métodos Y. Eles são definidos na classe Object, então todo objeto em Rails consegue responder a esses métodos. Vamos falar um pouco sobre eles?

blank?

O método blank?, como o nome diz, verifica se o conteúdo daquele objeto é vazio, isto é, em branco. Dependendo do tipo de objeto em que ele for chamado, seu comportamento será diferente. Vamos ver alguns exemplos:

# strings

"".blank?
# => true

" ".blank?
# => true

"banana".blank?
# => false

# enumerators

[].blank?
# => true

{}.blank?
# => true

[nil].blank?
# => false

["", " "].blank?
# => false

# outros tipos

nil.blank?
# => true

10.blank?
# => false

present?

O método present? é exatamente o oposto do blank?. Você pode ver a implementação aqui. Vamos aos exemplos:

# strings

"".present?
# => false

" ".present?
# => false

"banana".present?
# => true

# enumerators

[].present?
# => false

{}.present?
# => false

[nil].present?
# => true

["", " "].present?
# => true

# outros tipos

nil.present?
# => false

10.present?
# => true

No final pode parecer que não faz tanta diferença usar present? ou blank?, mas é mais fácil ler um código como if user.present? do que unless user.blank? ou if person.blank? ao invés de unless person.present?. Usar a legibilidade do código como critério para escolher o método usado é a dica mais valiosa :)

Última dica: em Rails também temos o método present que retorna o valor do objeto ou nil se ele não estiver present?.