Ternary expression with "defined?" returns "expression" instead of value?

expression, ruby, ternary-operator

Solution

`defined?` is binding to `amount ? amount : r(1,4)` so it is equivalent to:

defined?(amount ? amount : r(1,4))

You probably want:

defined?(amount) ? amount : r(1,4)

Actually, odds are that `amount || r(1,4)`, or `amount.nil? ? r(1,4) : amount` would better match what you want, since I think you don't want this:

1.9.3p194 :001 > defined?(amount)
 => nil 
1.9.3p194 :002 > amount = nil
 => nil 
1.9.3p194 :003 > defined?(amount)
 => "local-variable" 

...in which case `@c` would be `nil` - the value of the defined variable.

Problem

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!

Original source