Can someone explain the following code to me?

做~自己de王妃 提交于 2019-12-01 22:31:24

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"
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!