繁体   English   中英

Rails-在if语句中将1映射为true

[英]Rails - map 1 to true in if statement

我收到来自移动应用程序的请求。 它们被发送的可变isbookmarked其可以是10 我正在检查if语句。

if isbookmarked
  do something
else
  do something
end

else部分永远不会执行,因为不能将0识别为false

我该如何实现?

在Ruby中,除了nilfalse之外,其他所有内容都是真实的。 因此01都是真实的-通过此设置,您将永远无法达到else部分。

因此,在您的情况下,您想检查01

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM