В Restful Authentication , я обнаружил, что current_user
довольно сложно, что, когда @current_user
установлено в false, это означает, что не пытаться снова найти пользователя (обычно из БД),в то время как nil
означает, что все в порядке, можно снова искать в БД:
Строка 8 из lib/authenticated_system.rb
def current_user
@current_user ||= (login_from_session
|| login_from_basic_auth
|| login_from_cookie) unless @current_user == false
end
сложная вещь, если она пытается найти БД изlogin_from_session
и т. Д., И он не может найти его, тогда последнее значение, присвоенное @current_user
, равно nil
, и метод возвращает nil
(что является последним оцененным значением в методе).Если в другом месте кода нет двух других мест, которые на самом деле могут установить @current_user
в false, и это вызовет unless
, в результате чего весь оператор вернет nil
, тогда как @current_user
останется как false
, иметод возвращает nil
...
Я почти потерял дар речи, когда код полагался на эти запутанные факты.false
имеет особое значение, а nil
имеет особое значение в коде, но не документируется, не комментируется, и current_user
может принимать значение nil
, тогда как @current_user
может оставаться равным false
.Это на самом деле шаблон дизайна, так что люди знакомы с ним и знают это хорошо?