我收到移动应用的请求。他们发送的变量isbookmarked
可以是1
或0
。我正在检查if声明。
if isbookmarked
do something
else
do something
end
else
部分永远不会执行,因为0
无法识别为false
我怎样才能做到这一点?
答案 0 :(得分:2)
在Ruby中,除nil
和false
外,一切都很简洁。因此,0
和1
都是真实的 - 您将永远无法通过此设置到达else
部分。
因此,在您的情况下,您要确切地检查0
或1
:
if isbookmarked == 1
do something
elsif isbookmarked == 0
do something
end
答案 1 :(得分:1)
您还可以使用zero?
检查值是否为零。但是没有特殊的方法只能检查1 isbookmarked == 1
if isbookmarked.zero?
do something
else
do something
end
答案 2 :(得分:1)
你可以使用这个名为wannabe_bool的gem,你会得到一个to_b
方法,可以将几乎所有东西都转换成布尔值,你可以查看gem文档中所有可用的选项。
if isbookmarked.to_b
do something
else
do something
end
我在控制台上尝试了一些可以帮助你的东西
2.0.0-p451 :002 > "1".to_b
=> true
2.0.0-p451 :003 > "0".to_b
=> false
2.0.0-p451 :004 > 1.to_b
=> true
2.0.0-p451 :005 > 0.to_b
=> false
https://github.com/prodis/wannabe_bool
希望有所帮助!
答案 3 :(得分:1)
所以,除了@AndreyDaineko之外,您还可以使用case
case isbookmarked
when 1
do something
when 0
do something
else
something go wrong
end
答案 4 :(得分:1)
下面的辅助方法可能会派上用场。
def truthy?(val)
val.present? && !val.to_s.strip.in?(['false', '0'])
end
答案 5 :(得分:1)
我认为你应该使用Rails用来识别布尔值的逻辑。 Rails像这样实现type casting to booleans:
FALSE_VALUES = [false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"].to_set
def cast_value(value)
if value == ""
nil
else
!FALSE_VALUES.include?(value)
end
end
您可以像这样使用此实现(Rails 5版本):
ActiveModel::Type::Boolean.new.cast(isbookmarked)
或者Rails 4.2版本看起来像这样:
ActiveRecord::Type::Boolean.new.type_cast_from_user(isbookmarked)