0

Restful Authentication中,我发现这current_user是相当复杂的,当@current_user设置为 false 时,这意味着不要尝试再次查找用户(通常来自 DB),而nil意味着没关系,可以在 DB 中再次查找:

第 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_usernil,并且该方法返回nil(这是该方法中的最后一个评估值)。除非其他地方的代码中还有另外两个地方实际上可以设置@current_user为 false,这将触发unless,导致整个语句返回nil,而@current_user保持为false,并且方法返回nil......

对于依赖这些错综复杂的事实的代码,我几乎说不出话来。 false有特殊含义,nil在代码中有特殊含义,但没有文档,没有注释,current_user可以是nil,而@current_user可以继续是false。难道它实际上是一种设计模式,所以人们对它很熟悉,很了解吗?

4

1 回答 1

1

在 Rails 历史的这一点上,RestfulAuthentication 被认为是相当陈旧和令人讨厌的,部分原因是您所指出的代码。

我认为大多数人会建议您使用更现代的身份验证解决方案,例如 Devise 或 Authlogic。

于 2011-02-24T05:45:52.200 回答