Can someone explain the following code to me?

I am following along with Rails 3 in an action book and it is about overriding to_s

in a model. The code is as follows:

def to_s
  "#{email} (#{admin? ? "Admin" : "User"})"


I know that in Ruby you can display a value inside double quotes "#{value}"

, but what about double question marks?


source to share

5 answers

This is string interpolation . "#{email} (#{admin? ? "Admin" : "User"})"

equivalent to

email.to_s + " (" + (admin? ? "Admin" : "User") + ")"



email.to_s + " (" + if admin? then "Admin" else "User" end + ")"


This results in quotation marks in this context Admin

and User

are used as strings and not as constants.



The first question mark is on rails attribute query methods.

(unless you have overwritten / overridden this method)

This is a shorthand method to see if this attribute is present or not.



Really an admin? it is a function (possibly defined somewhere in a method or controller / helper model) that return a boolean value (true or false) and the next question mark as an if condition

if admin? == true


the first part before ":" is for true case and the other is for false case



Don't think of it as a double question mark, the first question mark is part of the method name (Ruby allows method names to end with "!", "?", "=", "[]", Etc.). Since admin is a boolean ActiveRecord, add an admin? a method that returns true if the user is an administrator, otherwise false.

Another question mark is used with a colon (:) and you can see it as:

condition ? statement_1 : statement_2


If the condition is true, the first statement is executed and the second is evaluated.

So, put these two things together and you have a concatenation of strings that add the word "Admin" or "User" between the brackets.



This function returns a string with the email address and whether it is an administrator or a user ... i.e.

user_1 = {:email => "", :admin => true}


so call



will return a string

" Admin"




All Articles