unless rails not nil method empty blank ruby null

rails - Ruby verifica si nula antes de llamar al método.



ruby unless (8)

Tengo una cadena en Ruby en la que llamo al método de tira para eliminar los espacios en blanco iniciales y finales. p.ej

s = "12345 " s.strip

Sin embargo, si la cadena está vacía me sale el siguiente error.

NoMethodError: método indefinido `strip ''para nil: NilClass

Estoy usando Ruby 1.9, ¿cuál es la forma más fácil de verificar si el valor es nulo antes de llamar al método de tira?

Actualizar:

Intenté esto en un elemento de una matriz pero tuve el mismo problema:

data[2][1][6].nil? ? data[2][1][6] : data[2][1][6].split(":")[1].strip


Método que funciona para mí (lo sé, nunca debería contaminar el espacio del Object prístino, pero es tan conveniente que me arriesgaré):

class Object def unless_nil(default = nil, &block) nil? ? default : block[self] end end p "123".unless_nil(&:length) #=> 3 p nil.unless_nil("-", &:length) #=> "-"

En tu caso particular podría ser:

data[2][1][6].unless_nil { |x| x.split(":")[1].unless_nil(&:strip) }


Puedes usar el método try desde ActiveSupport (biblioteca Rails)

gem install activesupport require ''active_support/core_ext/object/try'' s.try(:strip)

o puedes usar mi gema tryit que ofrece instalaciones adicionales:

gem install tryit s.try { strip }


Ruby 2.3.0 agregó un operador de navegación segura ( &. ) Que comprueba si hay cero antes de llamar a un método.

s&.strip

NoMethodError nil si s es nil , en lugar de elevar NoMethodError .


Si desea evitar el error que aparece en la pregunta:

s.to_s.strip


Si no te importa el objeto extra que se está creando, cualquiera de estos trabajos:

"#{s}".strip s.to_s.strip

Sin objeto extra:

s && s.strip s.strip if s


Simplemente pon:

s = s.nil? ? s : s.strip

Tl; dr. Compruebe si s es nulo, luego devuelva s; de lo contrario, elimínelo.


Supongo que el método más fácil sería el siguiente:

s.strip if s


ActiveSupport viene con un método para eso: try . Por ejemplo, an_object.try :strip devolverá nil si an_object es nil, pero procederá de lo contrario. La sintaxis es la misma que send . Cf active_support_core_extensions.html#try .