Can someone explain the following code to me?

匆匆过客 提交于 2019-12-01 23:52:41

问题


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?


回答1:


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.




回答2:


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.




回答3:


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




回答4:


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.




回答5:


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"


来源:https://stackoverflow.com/questions/9867122/can-someone-explain-the-following-code-to-me

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