Ruby on rails 如何解决'false.blank?'rubyonrails中的'gotcha'问题?

Ruby on rails 如何解决'false.blank?'rubyonrails中的'gotcha'问题?,ruby-on-rails,Ruby On Rails,我需要检查布尔变量的值是否已设置,通过检查它是否包含空字符串“或nil表示未设置值,另一个值如true或false表示已设置值 我尝试使用blank?但是Rails在blank?方法上有这个问题,当调用false时,它实际上会返回true false.blank?#返回真值 所以,当变量的值被设置为false时,它会给出值的假负值,就好像变量没有被设置一样 如何在RubyonRails中检查变量是否未设置(”,nil),或者是否已设置(true,false,0,1),我发现最简单的方法是在调用b

我需要检查布尔变量的值是否已设置,通过检查它是否包含空字符串
nil
表示未设置值,另一个值如
true
false
表示已设置值

我尝试使用
blank?
但是Rails在
blank?
方法上有这个问题,当调用
false
时,它实际上会返回
true

false.blank?#返回真值

所以,当变量的值被设置为false时,它会给出值的假负值,就好像变量没有被设置一样


如何在RubyonRails中检查变量是否未设置(
nil
),或者是否已设置(
true
false
0
1
),我发现最简单的方法是在调用
blank?
之前先调用

[“”,“”,nil,false,true,0,1]。映射{val{val.to_.s.blank?} #=>[真,真,真,假,假,假,假]


[编辑以首先给出此解决方案]:我认为最好的解决方案是明确说明:

def not_set?(x)
  [nil, ''].include?(x)
end
这将比转换为字符串更有效,所有人都能清楚地理解,并涵盖了未来未知的意外输入


这是我最初的解决方案,更简洁、更ruby,但性能和健壮性较差:

请尝试
my\u var.to\u s.empty?

我相信这涵盖了您感兴趣的所有六个案例:

puts " show unset (nil, '') "
puts ''.to_s.empty?
puts nil.to_s.empty?

puts " show set (true, false, 0, 1) "
puts true.to_s.empty?
puts false.to_s.empty?
puts 0.to_s.empty?
puts 1.to_s.empty?
收益率:

show unset (nil, '') 
true 
true 
show set (true, false, 0, 1) 
false 
false 
false 
false 

检查这个,我会说这是一个更干净的方法(我打赌它更快,因为它不需要创建字符串)。另外,
blank?
实际上不是Ruby在
true
false
上定义的,Rails添加了这个方法(只是为了澄清,因为你的问题说它是Ruby的,但实际上不是Ruby的)。编辑:我错过了你想要将0和1也检测为集合的机会,这对那一点不起作用,@kosVandra。OP不希望它在数组或散列上工作……只希望是“”、nil、false和true。但是考虑到你的评论,我更强烈地感觉到我的答案中的
is_set()
建议可能是最好的解决方案。它将涵盖所有需要的情况,包括特殊情况。(比如数组、散列或更奇怪的东西。)