Rails - 在if语句

时间:2016-11-02 10:20:04

标签: ruby-on-rails ruby if-statement boolean

我收到移动应用的请求。他们发送的变量isbookmarked可以是10。我正在检查if声明。

if isbookmarked
  do something
else
  do something
end

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

我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:2)

在Ruby中,除nilfalse外,一切都很简洁。因此,01都是真实的 - 您将永远无法通过此设置到达else部分。

因此,在您的情况下,您要确切地检查01

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)