Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine if there is a match an return true or false in rails?

I want to create a test that returns either true or false for email handling.

For now, if the email address starts with r+ then it's true otherwise it's false. This will help our server ignore a lot of the SPAM we are getting hit with.

Examples:

[email protected] .. true
[email protected] .. true
[email protected] .. FALSE

What's the most efficient way to handle this with Rails/ruby/regex?

Thanks

GOAL

Is a one liner in rails/ruby with:

ABORT if XXXXX == 0
like image 822
AnApprentice Avatar asked Sep 09 '11 17:09

AnApprentice


4 Answers

This will match:

/^r\+.*@site.com$/

Examples:

>> '[email protected]' =~ /^r\+.*@site.com$/ #=> 0
>> '[email protected]' =~ /^r\+.*@site.com$/ #=> nil

Since everything that isn't nil or false is truthy in Ruby, you can use this regex in a condition. If you really want a boolean you can use the !! idiom:

>> !!('[email protected]' =~ /^r\+.*@site.com$/) #=> false
>> !!('[email protected]' =~ /^r\+.*@site.com$/) #=> true
like image 113
Michael Kohl Avatar answered Nov 02 '22 00:11

Michael Kohl


If you're in Rails, there's a starts_with? method on strings:

"foo".starts_with?('f') # => true
"foo".starts_with?('g') # => false

Outside of Rails, regexes are a reasonable solution:

"foo" =~ /^f/ # => true
"foo" =~ /^g/ # => false

Because Ruby uses truthiness in if statements, if you do end up using regexes, you can just use the return value to switch:

if "foo" =~ /^f/
  puts "Was true!"
else
  puts "Was false!"
end

If you're writing a method and want to return a boolean result, you could always use the double bang trick:

def valid_email?
  !!("foo" =~ /^f/)
end

Rubular (rubular.com) is a good site for testing Ruby regexes pre-1.9. (1.9's regexes added things like lookahead.)

like image 41
Kyle Avatar answered Nov 02 '22 01:11

Kyle


If you don't want to use an "!!" operator:

!!("foo" =~ /^f/)

you could use a ternary operator (might look more obvious):

"foo" =~ /^f/ ? true : false
like image 10
Evmorov Avatar answered Nov 02 '22 01:11

Evmorov


You can use the '===' operator as well

/f/ === 'foo' #=> true

/f/ === 'bat' #=> false

Note: The regex part is on the left:

/YOUR_REGEX/ === 'YOUR_STRING'

like image 7
Pascal Avatar answered Nov 02 '22 02:11

Pascal