这真的是我的大脑,但也许我正在努力。
我通过网址传递了一个参数(example.com?debug=true)
所以我基本上想说:
if params[:debug] == true
do xyz
else
do abc
end
但是无论出于什么原因,if语句似乎没有像它那样做。
如果基于param的/ else语句为true或false,有没有更好的方法呢?
调试参数的值为true,没有值,或者值为false(就URL而言)。
答案 0 :(得分:49)
params以字符串形式出现,因此您需要与"true"
进行比较,而不是true
。
答案 1 :(得分:30)
如果你不想重新发明轮子,你可以使用ActiveRecord检查真值的方法(这是在ActiveRecord对象中传递params时使用的方法
Rails 3-4.1
if ActiveRecord::ConnectionAdapters::Column.value_to_boolean(params[:debug])
do xyz
else
do abc
Rails 4.2.0
ActiveRecord::Type::Boolean.new.type_cast_from_database(params[:debug])
Rails 5
ActiveModel::Type::Boolean.new.cast(params[:debug])
可能值得帮助包装,但从来没有那么灵活:
rails c
Loading development environment (Rails 3.2.6)
1.9.3p194 :001 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean '1'
=> true
1.9.3p194 :002 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean '0'
=> false
1.9.3p194 :003 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 1
=> true
1.9.3p194 :004 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean true
=> true
1.9.3p194 :005 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 'true'
=> true
1.9.3p194 :006 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 'on'
=> true
1.9.3p194 :007 > ActiveRecord::ConnectionAdapters::Column.value_to_boolean 'off'
自定义附加信息
有些人对扩展核心类感到不满,但这确实符合DRY原则。
# config/initializer/boolean.rb
class Boolean
def self.parse(value)
ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
end
然后像
一样使用if Boolean.parse(params[:debug])
then xyz
答案 2 :(得分:6)
由于Rails / ActiveRecord 4.2.0,它是
if ActiveRecord::Type::Boolean.new.type_cast_from_user params[:debug]
do xyz
else
do abc
end
在Rails 5中它是:
if ActiveModel::Type::Boolean.new.cast params[:debug]
do xyz
else
do abc
end
答案 3 :(得分:5)
但是无论出于什么原因,if语句似乎没有像它那样做。
我几乎可以保证它正在做它应该做的事情。当事情没有意义时,我们的一个假设是错误的。
值实际上是布尔值还是字符串(或其他东西?)。如果值是一个字符串,那么当然与 boolean 值true的比较将失败。尝试比较'true',看看是否有效。
答案 4 :(得分:0)
这个怎么样?
params[:debug].to_s.downcase == 'true'