Can someone explain the following code to me?

前端 未结 5 1734
故里飘歌
故里飘歌 2021-01-20 05:59

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
           


        
相关标签:
5条回答
  • 2021-01-20 06:13

    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"
    
    0 讨论(0)
  • 2021-01-20 06:15

    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

    0 讨论(0)
  • 2021-01-20 06:17

    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.

    0 讨论(0)
  • 2021-01-20 06:24

    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.

    0 讨论(0)
  • 2021-01-20 06:31

    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.

    0 讨论(0)
提交回复
热议问题