[英]Rails - map 1 to true in if statement
我收到来自移动应用程序的请求。 它们被发送的可变isbookmarked
其可以是1
或0
。 我正在检查if语句。
if isbookmarked
do something
else
do something
end
else
部分永远不会执行,因为不能将0
识别为false
我该如何实现?
在Ruby中,除了nil
和false
之外,其他所有内容都是真实的。 因此0
和1
都是真实的-通过此设置,您将永远无法达到else
部分。
因此,在您的情况下,您想检查0
或1
:
if isbookmarked == 1
do something
elsif isbookmarked == 0
do something
end
您还可以使用zero?
检查该值是否为零。 但是没有特殊的方法来检查1的唯一方式isbookmarked == 1
if isbookmarked.zero?
do something
else
do something
end
您可以使用名为wannabe_bool的 gem,您将获得to_b
方法,该方法可以将几乎所有内容都转换为boolean,您可以查看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
希望有帮助!
因此,除了@AndreyDaineko,您还可以使用case
case isbookmarked
when 1
do something
when 0
do something
else
something go wrong
end
如下所示的辅助方法可能会派上用场。
def truthy?(val)
val.present? && !val.to_s.strip.in?(['false', '0'])
end
我认为您应该使用与Rails标识布尔值相同的逻辑。 Rails像这样将类型强制转换为布尔值 :
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.