I am following along with the Rails 3 in Action book, and it is talking about override to_s
in the model. The code is the following:
def to_s
"#{email} (#{admin? ? "Admin" : "User"})"
end
I know that in Ruby you can display a value inside double quotes by the "#{value}"
, but what's up with the double question marks?
It's string interpolation. "#{email} (#{admin? ? "Admin" : "User"})"
is equivalent to
email.to_s + " (" + (admin? ? "Admin" : "User") + ")"
that is
email.to_s + " (" + if admin? then "Admin" else "User" end + ")"
As a result of being enclosed in quotes, in this context Admin
and User
are used as strings and not as constants.
The first question mark is attribute query methods in rails. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Attribute+query+methods
(provided you did not overwrite / redefine that method)
It is a shorthand method to see if that attribute present or not.
Actually admin? is a function(probably defined somewhere in controller/helper method or model) that return boolean(true or false) and next question mark is just like a if condition
if admin? == true
"Admin"
else
"User"
first portion before ":" is for true case and other is for false case
Don't see it as a double question mark, the first question mark is part of the method name (Ruby allows methods name to end with "!", "?", "=", "[]", etc). Since admin is a boolean value ActiveRecord add an admin? method that returns true if the user is an admin, false otherwise.
The other question mark is used with the colon (:) and you can see it like:
condition ? statement_1 : statement_2
If condition is true the first statement is executed, else the second one it evalueted.
So put these two things together and you have a string concatenation that add the "Admin" or "User" word between parenthesis.
This function is returning a string with the email and whether it they are an admin or user...
ie
user_1 = {:email => "test@email.com", :admin => true}
so the call
user_1.to_s
would return the string
"test@email.com Admin"