Rails false.blank? 居然返回的是 true

smoothdvd · 2012年08月01日 · 最后由 dfxiaozi 回复于 2012年10月22日 · 4454 次阅读

太变态了

 # File activesupport/lib/active_support/core_ext/object/blank.rb, line 12
12:   def blank?
13:     respond_to?(:empty?) ? empty? : !self
14:   end

额。。。。

#1 楼 @hooopo 有更好的判断 boolean 存在的办法吗?现在改用.nil?

加入小贴士里面

我掉过类似的陷阱

irb
 => true 
ree-1.8.7-2011.03 :005 > a = false
 => false 
ree-1.8.7-2011.03 :006 > a ||= true

请问大家 a 是什么

的确不看不知道啊

#3 楼 @smoothdvd 看到频繁用.nil?的就知道用 Ruby 不超过半年... 正常的写法就是:

if condition
else
end

如果是 rails 表单传过来的值,可能有空字符串或换行:

if params[:xxx].present?
else
end

也有需要用.nil?的时候,就是要和 false 做特别区分的:

# 类似5楼的例子
enabled = true if enabled.nil?

#7 楼 @hooopo present?() An object is present if it’s not blank?. false.present? #false @huacnlee 这个也 tips 吧

这有什么变态的??????? false 当然就是 blank 的啊???? 真是无语了!

#7 楼 @hooopo

if condition else end

这个不能判断 boolean 是否存在吧

#10 楼 @smoothdvd 你说什么叫 boolean 是否存在?

#11 楼 @hooopo 我要判断一个 boolean 类型的参数是否存在

#12 楼 @smoothdvd 虽然还是没明白你的意思。。但是如果表单设计的让代码很难表示,说明表单设计的有问题。

#12 楼 @smoothdvd

我觉得楼主表达有问题,是否存在是用这个

defined?(var)

但我觉得楼主要用的是

var == false
var != true

#15 楼 @Rei defined?(var),学习了。

#16 楼 @smoothdvd 都已经返回 false 值了,用defined?做什么?

看你们讨论那么热烈,我反复看了 2 次,还没明白具体需求是什么。开始怀疑我的阅读能力了...

lz 明明是想看是否有这个值,当然 nil 不算

不变态啊,很正常啊

匿名 #21 2012年08月02日

#5 楼 @alvin2ye 凭直觉我觉得是 true, 试了一下果然是 true. 不明白为什么你会掉进"陷阱". a ||= true 等价于 a = a || true, 那么 a 的值就应该是 true 啊。陷阱在哪呢?

#21 楼 @tylerlong ruby 会抱怨说,其实你不懂我的心!

#21 楼 @tylerlong 同感。

#18 楼 @quakewang 我也不懂楼主的需求,我觉得楼主需要的就是个 defined? 函数来判断一个变量是否被定义了。

其实楼主不在乎那个类型是不是 boolean 类型的,只是在乎那个变量名代表的形参是否在函数被调用时被赋值了。否则的话,直接 if condition 就可以了。我觉得 defined? 函数可以解决楼主的问题,当然,更好的方法是帮那个形参设置默认值。不懂我这样的表述符不符合楼主遇到的问题?

还是同意 hooopo 的,实际开发的时候,基本上用 blank? 和 present? 就 ok 了。 一切你认为应该是“有值”的,皆为 present 的,反之就用 blank?。 这两个配合的另外好处是少用 ! 否定号,这样脑子不用绕弯子了。

与此类似的有 js 中常被认为 糟粕 的东西,也有一定道理。比如 空数组等都是 false。

使用的时候要注意是 rails 环境还是单纯的 ruby 环境

已经是 false 了,还要去判断一下,相当于这样:if( false==false)

可以为 数组添加一个 blank? 方法

class Array
  def blank?
    self==[]
  end
end

[].blank? 返回就是 true 同样可以添加很多方法:

{}.blank?
nil.blank?
0.blank?
"".blank?

@smoothdvd

最简单判断一个 variable 是不是 boolean 的方法:

!!var
需要 登录 后方可回复, 如果你还没有账号请 注册新账号