2

好的,我是绿色的,但下面的 def 似乎是双负-y

def signed_in?
  !current_user.nil?  #the current user is not...um...not
end

因为我的耐心导师 M.Hartl 在他的 Rails 教程中使用了它。我必须相信它是吱吱作响的,但是...

说“当前用户是”的东西不会更干净吗?

def signed_in?
  current_user
  current_user.present?
  current_user.any?
  !!current_user
end

爆款有什么好处?

4

3 回答 3

5
current_user          | nil    | false  | true  | ""    | []    | [nil] | [0]  
-----------------------------------------------------------------------------------
current_user          | nil    | false  | true  | ""    | []    | [nil] | [0]
!current_user.nil?    | false  | true   | true  | true  | true  | true  | true
!!current_user        | false  | false  | true  | true  | true  | true  | true
current_user.present? | false  | false  | true  | false | false | true  | true
current_user.any?     | error  | error  | error | error | false | false | true
于 2012-12-08T05:06:05.183 回答
1

在该示例中,您不关心用户是谁。您只想知道一个用户,任何用户,已登录。如果是这样,您将显示已登录用户的链接。

current_user.nil?是一个布尔值。如果用户已登录,则为 false。前面的 bang!current_user.nil?将其反转,因此如果任何用户已登录,则为 true,否则为 false。

你能想出另一种同样简洁的方法来实现这一点,不多也不少?

于 2012-12-08T04:21:54.670 回答
1

你可以:

def signed_in?
  current_user
end

如果你能忍受它不是从方法返回的布尔值。如果 current_user 为 nil signed_in?,则在 if 语句中使用时将评估为 false。检查零?没有必要,我想这是风格问题。

或者在您的调用代码中,您可以:

if current_user
  # do stuff
end

并摆脱额外的方法。

于 2012-12-08T09:02:44.723 回答