2010-09-14 2 views

ответ

4

Это отрицание (!) оператор повторяется дважды.

Обратите внимание, что только объекты ruby, имеющие значение false (в булевом выражении), являются nil и false.

Поэтому

  1. some_role будет верно, !some_role ложно и !!some_role верно снова.
  2. nil is false, !nil is true и !!nil является ложным.

Итак, это «умный» способ проверить, не верна ли роль, полученная от find_by_name, ноль или нет. (И поэтому существует ли роль с таким именем или нет)

Я думаю, мне не нужно говорить вам, что это плохо для читаемости. Вы всегда можете проверить, является ли результат нулем обычным способом, например result.nil? или result == nil.

+0

Спасибо, не уверен, что я его еще получаю. Как вы могли переписать это для удобочитаемости, для новичков-рельсов? – AnApprentice

+0

@nobosh Я немного переработал его. –

+0

Мне было любопытно, как вы могли бы переписать его, чтобы быть более четким, если это имеет смысл? thxs – AnApprentice

1

Это более читаемо. Нет необходимости в «себе» или «возврате». 'настоящее время?' противоположность «nil?» поэтому никакого отрицания не требуется.

def role?(role) 
    roles.find_by_name(role.to_s.camelize).present? 
end 
Смежные вопросы