我有一个Rails应用程序,我正在使用jQuery在后台查询我的搜索视图。有字段q
(搜索字词),start_date
,end_date
和internal
。 internal
字段是一个复选框,我正在使用is(:checked)
方法构建查询的网址:
$.getScript(document.URL + "?q=" + $("#search_q").val() + "&start_date=" + $("#search_start_date").val() + "&end_date=" + $("#search_end_date").val() + "&internal=" + $("#search_internal").is(':checked'));
现在我的问题出在params[:internal]
,因为有一个字符串要么包含“true”或“false”,我需要将它转换为boolean。我当然可以这样做:
def to_boolean(str)
return true if str=="true"
return false if str=="false"
return nil
end
但我认为必须采用更加Ruby的方式来解决这个问题!不存在......?
答案 0 :(得分:129)
据我所知,没有内置的方法可以将字符串转换为布尔值,
但如果您的字符串只包含'true'
和'false'
,则可以将方法缩短为以下内容:
def to_boolean(str)
str == 'true'
end
答案 1 :(得分:47)
ActiveRecord提供了一种干净的方法。
def is_true?(string)
ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(string)
end
ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES
将True值的所有明显表示都表示为字符串。
答案 2 :(得分:23)
请注意,这个简单形式的答案仅适用于下面列出的其他用例,而不是问题中的答案。虽然大部分是固定的,但是有很多YAML related security vulnerabilities是由于将用户输入加载为YAML而引起的。
我用来将字符串转换为bools的技巧是YAML.load
,例如:
YAML.load(var) # -> true/false if it's one of the below
YAML bool接受了相当多的truthy / falsy字符串:
y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF
假设您有一段这样的配置代码:
config.etc.something = ENV['ETC_SOMETHING']
在命令行中:
$ export ETC_SOMETHING=false
现在由于ENV
vars是代码内部的字符串,config.etc.something
的值将是字符串"false"
,并且它会错误地评估为true
。但如果你喜欢这样:
config.etc.something = YAML.load(ENV['ETC_SOMETHING'])
一切都会好的。这与.yml文件中的加载配置兼容。
答案 3 :(得分:16)
没有任何内置的方法来处理这个问题(虽然actionpack可能有一个帮助器)。我会建议这样的事情
def to_boolean(s)
s and !!s.match(/^(true|t|yes|y|1)$/i)
end
# or (as Pavling pointed out)
def to_boolean(s)
!!(s =~ /^(true|t|yes|y|1)$/i)
end
也可以使用0和非0而不是false / true文字:
def to_boolean(s)
!s.to_i.zero?
end
答案 4 :(得分:7)
ActiveRecord::Type::Boolean.new.type_cast_from_user
根据Rails的内部映射ConnectionAdapters::Column::TRUE_VALUES
和ConnectionAdapters::Column::FALSE_VALUES
执行此操作:
[3] pry(main)> ActiveRecord::Type::Boolean.new.type_cast_from_user("true")
=> true
[4] pry(main)> ActiveRecord::Type::Boolean.new.type_cast_from_user("false")
=> false
[5] pry(main)> ActiveRecord::Type::Boolean.new.type_cast_from_user("T")
=> true
[6] pry(main)> ActiveRecord::Type::Boolean.new.type_cast_from_user("F")
=> false
[7] pry(main)> ActiveRecord::Type::Boolean.new.type_cast_from_user("yes")
DEPRECATION WARNING: You attempted to assign a value which is not explicitly `true` or `false` ("yes") to a boolean column. Currently this value casts to `false`. This will change to match Ruby's semantics, and will cast to `true` in Rails 5. If you would like to maintain the current behavior, you should explicitly handle the values you would like cast to `false`. (called from <main> at (pry):7)
=> false
[8] pry(main)> ActiveRecord::Type::Boolean.new.type_cast_from_user("no")
DEPRECATION WARNING: You attempted to assign a value which is not explicitly `true` or `false` ("no") to a boolean column. Currently this value casts to `false`. This will change to match Ruby's semantics, and will cast to `true` in Rails 5. If you would like to maintain the current behavior, you should explicitly handle the values you would like cast to `false`. (called from <main> at (pry):8)
=> false
因此,您可以在初始化程序中创建自己的to_b
(或to_bool
或to_boolean
)方法:
class String
def to_b
ActiveRecord::Type::Boolean.new.type_cast_from_user(self)
end
end
答案 5 :(得分:5)
你可以使用wannabe_bool gem。 https://github.com/prodis/wannabe_bool
这个gem为String,Integer,Symbol和NilClass类实现了一个#to_b
方法。
params[:internal].to_b
答案 6 :(得分:5)
在Rails 5中,您可以使用ActiveRecord::Type::Boolean.new.cast(value)
将其强制转换为布尔值。
答案 7 :(得分:3)
我认为Ruby中没有内置的东西。您可以重新打开String类并在那里添加to_bool方法:
class String
def to_bool
return true if self=="true"
return false if self=="false"
return nil
end
end
然后您可以在项目的任何位置使用它,例如:params[:internal].to_bool
答案 8 :(得分:2)
查看Virtus的源代码,我可能会这样做:
def to_boolean(s)
map = Hash[%w[true yes 1].product([true]) + %w[false no 0].product([false])]
map[s.to_s.downcase]
end
答案 9 :(得分:2)
可能str.to_s.downcase == 'true'
表示完整性。即使str
为零或0,也不会崩溃。
答案 10 :(得分:1)
您可以考虑仅将internal
附加到您的网址,如果确实如此,那么如果未选中该复选框并且您没有追加它params[:internal]
将是nil
,在Ruby中评估为false。
我对你正在使用的特定jQuery并不熟悉,但是除了手动构建URL字符串之外,还有更简洁的方法来调用你想要的东西吗?您看过$get
和$ajax
了吗?
答案 11 :(得分:1)
您可以添加String类以使用to_boolean方法。然后你可以做真正的&#39; .to_boolean或&#39; 1&#39; .to_boolean
class String
def to_boolean
self == 'true' || self == '1'
end
end
答案 12 :(得分:-4)
我很惊讶没有人发布这个简单的解决方案。那就是如果你的字符串是&#34; true&#34;或&#34;假&#34;。
def to_boolean(str)
eval(str)
end