我有一个参数params[:input]
,它的值是'true'
或'false'
(字符串中的布尔值)。
在数据库中,输入值存储为1
和0
。我需要根据输入的字符串值返回布尔值。我在下面创建了一个返回布尔值的函数。
def status(input)
return unless input.present?
return false if ['false'].include?(input.downcase)
return true if ['true'].include?(input.downcase)
end
不确定这是否是最好的方法。有没有更好的方法来写这个?
答案 0 :(得分:0)
我会选择case
。由于存在二进制状态,因此您可能需要确定要为回退选择什么值。例如当不存在任何参数时,您可能仍需要返回某些内容。除false
外,我将返回'true'
:
def status(input)
case input
when 'true' then true
when 'false' then false
else false
end
end
或者,甚至更短(但更不易理解/习惯):
def status(input)
'true' == input
end
答案 1 :(得分:0)
最简单的解决方案是这样的,而没有switch语句等开销:
def status(input)
input.is_a?(String) && input.casecmp?('true')
end
casecmp?
确保不区分大小写,因此'true'
,'TRUE'
,'True'
以及不同情况下的任何变化都将返回布尔值true
。
甚至可以稍作更改,以通过在其上调用to_s
来确保输入是字符串,如果已经是字符串,则返回self
。
def status(input)
input.to_s.casecmp?('true')
end
第一个比较安全,因为根据传递的对象,to_s
可能会被覆盖并提供不可预测的行为,尽管可能性很小。
另一种解决方案是使用downcase
并与==
进行比较,但是casecmp?
进行了比较优化,并且没有像downcase
那样创建额外的字符串。
答案 2 :(得分:0)
似乎您想将字符串转换为布尔值,并且正在使用Ruby on Rails。为什么不使用Rails本身用来将用户输入转换为布尔值的方法?
def status(input)
ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
end
方法的名称在不同版本的Rails中已更改。以上版本适用于Rails 4.2。以前的Rails 4.2使用ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
,而从Rails 5开始,它是ActiveRecord::Type::Boolean.new.cast(value)
使用build方法的优点是它不仅接受字符串'true'
和'false'
,还接受其他常见输入,并且仍然返回有用的布尔值。