根据字符串布尔输入值返回布尔值

时间:2018-08-01 02:55:12

标签: ruby ruby-on-rails-4

我有一个参数params[:input],它的值是'true''false'(字符串中的布尔值)。

在数据库中,输入值存储为10。我需要根据输入的字符串值返回布尔值。我在下面创建了一个返回布尔值的函数。

def status(input)
  return unless input.present?
  return false if ['false'].include?(input.downcase)
  return true if ['true'].include?(input.downcase)
end

不确定这是否是最好的方法。有没有更好的方法来写这个?

3 个答案:

答案 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那样创建额外的字符串。

Documentation for case_cmp?

答案 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',还接受其他常见输入,并且仍然返回有用的布尔值。