我没有Ruby经验,所以我的代码感觉“丑陋”而不是惯用语:
def logged_in?
!user.nil?
end
我宁愿拥有像
这样的东西def logged_in?
user.not_nil?
end
但找不到与nil?
答案 0 :(得分:48)
当您使用ActiveSupport时,user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F只检查非零,为什么不使用
def logged_in?
user # or !!user if you really want boolean's
end
答案 1 :(得分:48)
你似乎过分担心布尔人。
def logged_in?
user
end
如果用户为nil,则为logged_in?将返回“假”值。否则,它将返回一个对象。在Ruby中,我们不需要返回true或false,因为我们在JavaScript中有“truthy”和“falsey”值。
<强>更新强>
如果你正在使用Rails,你可以使用present?
方法更好地阅读:
def logged_in?
user.present?
end
答案 2 :(得分:15)
也许这可能是一种方法:
class Object
def not_nil?
!nil?
end
end
答案 3 :(得分:14)
请注意提出present?
的其他答案作为您问题的答案。
present?
与rails中的blank?
相反。
present?
检查是否有有意义的值。这些事情可能会导致present?
检查失败:
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
!nil?
支票给出:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
检查对象是否实际为nil
。还有别的:空字符串,0
,false
,等等,不是nil
。
present?
非常有用,但绝对不是nil?
的反面。混淆两者可能会导致意外错误。
对于您的用例present?
将起作用,但了解其中的区别总是明智的。
答案 4 :(得分:4)
您可以使用以下内容:
if object
p "object exists"
else
p "object does not exist"
end
这不仅适用于nil,也适用于false等,因此您应该测试它是否在您的用例中运行。
答案 5 :(得分:1)
我遇到了这个问题,正在寻找一种对象方法,因此我可以使用Symbol#to_proc
shorthand而不是一个块;我发现arr.find(&:not_nil?)
比arr.find { |e| !e.nil? }
更具可读性。
我找到的方法是Object#itself
。在我的用法中,我想在键name
的哈希值中查找值,在某些情况下,该键偶然被大写为Name
。一线如下:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
如other answers中所述,在测试布尔值的情况下,此操作将严重失败。
答案 6 :(得分:0)
我可以针对background-image: url(${LogoImage});
background-repeat:no-repeat;
background-position: center center;
background-attachment: fixed;
方法的结果提供Ruby-esque background: url(${LogoImage}) no-repeat center center fixed;
方法。
!
太深了,RubyMine IDE会将其标记为错误。 ;-)