I'm pretty new to Ruby and Rails but even after searching stack overflow and google I couldn't find an answer to this.
I've got a simple Ruby shorthand if statement that should return an integer
like so:
# in the context of this erb document `amount` is defined as 5.
@c = ( defined? amount ? amount : r( 1,4 ) )
r()
is a custom helper function that returns a random number between in this case 1 and 4.
The way I intend this to work is that if
amount
is defined, then use the number defined as amount
, else
generate a random number between 1 and 4 and use that instead.
When printing out @c
however Ruby outputs expression
rather than a number.
What do I have to do to get this working as I intended and what am I doing wrong?
Many thanks for reading!
You're looking for the null coalescing operator. Try this:
This code will assign amount to @c if amount is defined. If not it will assign the result of r(1,4) to @c.
http://eddiema.ca/2010/07/07/the-null-coalescing-operator-c-ruby-js-python/
defined?
is binding toamount ? amount : r(1,4)
so it is equivalent to:You probably want:
Actually, odds are that
amount || r(1,4)
, oramount.nil? ? r(1,4) : amount
would better match what you want, since I think you don't want this:...in which case
@c
would benil
- the value of the defined variable.Use the
||
operator in this case:In your code, the
defined?
method operates onamount ? amount : r( 1,4 )
instead of just onamount
as you intended. Also, thedefined?
operator probably doesn't do what you expect, have a look at this blog entry to get an idea.