Reputation: 4932
What's the best way to check if a variable is not blank in an else if condition in Ruby (not Rails)?
elsif not variable.to_s.empty?
# do something
end
or
elsif !variable.to_s.empty?
# do something
end
or
elsif variable.to_s.length > 0
# do something
end
Upvotes: 66
Views: 100941
Reputation: 1258
The source of the empty?
method is analogous to the following:
def empty?
return length == 0
end
So, you can safely use
any_string.length != 0
Anyway, using that code inside an else if is a bit verbose, I would encourage you to define the present?
method inside the String
class.
class String
def present?
!empty?
end
end
Now you can write your code the following way:
if some_condition
# do something
elsif variable.to_s.present?
# do something else
end
This way you get a clear code, without using negations
or unless
who are hard to read.
Of course, there is one problem here, I took the present?
name (and method) from Rails. present?
returns true if the object is not blank, but strings with tabs or spaces (white characters) are considered blanks. So, this present?
will return true to for the following strings:
"".present? # => false
" ".present? # => true
"\t\n\r".present? # => true
" blah ".present? # => true
It depends on what you want, high chances are that you want to get true for the first 3 strings, and false for the later. You could use @RamanSM approach and use strip
to avoid empty spaces
class String
def present?
!strip.empty?
end
end
now, present?
returns false for strings with white spaces
"".present? # => false
" ".present? # => false
"\t\n\r".present? # => false
" blah ".present? # => true
Note: Consider that String.present?
is present in the ActiveSupport library (which ships with rails) if you add ActiveSupport or use Rails you should use ActiveSupport implementation instead.
Upvotes: 4
Reputation: 1527
If you prefer if
to unless
...
If you know your variable will be a String...if str[0]
With nil check...if str && str[0]
OR if str&.[](0)
(I prefer the latter but it might look odd to some people and requires Ruby >= 2.3).
Also...I'd be very careful about calling #to_s
on anything because you could end up with unexpected results. If str
turns out to be something that you weren't expecting...
str = false
str.to_s[0] # => 'f' (i.e. truthy)
str.to_s.empty? # => false
str = nil
str.to_s[0] # => nil (i.e. falsey)
str.to_s.empty? # => true
I think this caution applies to usage of #to_s
in the other answer here as well. Exceptions can be your friend.
Upvotes: 0
Reputation: 283
I just found out that ''.empty?
returns true
but ' '.empty?
returns false
. Even to_s.length
for ' '
is not zero.
Maybe it is better to use strip as ' '.strip.empty?
Upvotes: 8
Reputation: 299
For the string (say abc) which is not defined/undefined we should check for abc.nil?
otherwise abc.blank? will throw (NoMethodError) undefined method empty?
for nil:NilClass error
Upvotes: 0
Reputation: 8478
You can use either
unless var.empty?
#do sth
end
or
unless var == ""
#do sth
end
or all of these with if
and a negator !
.
Upvotes: 6