在Ruby on Rails中,使用false表示什么样的设计模式表示不查看DB,nil表示可以查找?

时间:2011-02-24 05:37:44

标签: ruby-on-rails ruby-on-rails-3 restful-authentication code-readability

Restful Authentication中,我发现current_user非常复杂,当@current_user设置为false时,则表示不再尝试再次查找用户(通常来自数据库)虽然nil表示没问题,但可以在DB中再次查找:

lib/authenticated_system.rb

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

我几乎说不出话来依赖这些错综复杂的事实。 nil具有特殊含义,false在代码中具有特殊含义,但没有记录,没有评论,nil可以是current_user,而nil可以继续@current_user。它实际上是一种设计模式,所以人们熟悉并熟悉它吗?

1 个答案:

答案 0 :(得分:1)

在Rails历史中,RestfulAuthentication在这一点上被认为是非常陈旧和令人讨厌的,部分原因是代码就像你指出的那样。

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