Может кто-нибудь объяснить мне следующий код? - PullRequest
3 голосов
/ 26 марта 2012

Я следую вместе с Rails 3 в книге действий, и речь идет о переопределении to_s в модели.Код следующий:

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

Я знаю, что в Ruby вы можете отображать значение в двойных кавычках с помощью "#{value}", но что случилось с двойными вопросительными знаками?

Ответы [ 5 ]

7 голосов
/ 26 марта 2012

Это строка интерполяции ."#{email} (#{admin? ? "Admin" : "User"})" эквивалентно

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

, то есть

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

В результате включения в кавычки, в этом контексте Admin и User используются в качестве строк ине как константы.

2 голосов
/ 26 марта 2012

Не рассматривайте его как двойной знак вопроса, первый знак вопроса является частью имени метода (Ruby позволяет имени метода заканчиваться на «!», «?», «=», «[]» И т. Д. ). Так как admin является логическим значением ActiveRecord, добавить администратора? метод, который возвращает true, если пользователь является администратором, иначе false.

Другой знак вопроса используется с двоеточием (:), и вы можете видеть его так:

condition ? statement_1 : statement_2

Если условие истинно, выполняется первый оператор, в противном случае - второй оператор.

Итак, сложите эти две вещи вместе, и у вас будет конкатенация строк, в которой между круглыми скобками будет добавлено слово «Администратор» или «Пользователь».

2 голосов
/ 26 марта 2012

Собственно админ? это функция (вероятно, определенная где-то в методе или модели контроллера / помощника), которая возвращает логическое значение (истина или ложь), а следующий вопросительный знак аналогичен условию if

if admin? == true
 "Admin"
else
 "User"

первая часть перед «:» для истинного регистра, а другая для ложного регистра

2 голосов
/ 26 марта 2012

Первый знак вопроса - это методы запроса атрибутов в рельсах. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Attribute+query+methods

(при условии, что вы не перезаписали / переопределите этот метод)

Это сокращенный метод для определения наличия или отсутствия этого атрибута.

1 голос
/ 26 марта 2012

Эта функция возвращает строку с адресом электронной почты и является ли она администратором или пользователем ... то есть

user_1 = {:email => "test@email.com", :admin => true}

так что звоните

user_1.to_s 

вернет строку

"test@email.com Admin"
...