如何检查参数是真还是假?

Shp*_*ord 29 ruby ruby-on-rails

这真的是我的大脑,但也许我正在努力.

我通过URL传递一个参数(example.com?debug=true)

所以我基本上想说:

if params[:debug] == true
 do xyz
else
 do abc
end
Run Code Online (Sandbox Code Playgroud)

但无论出于什么原因,if语句似乎没有像它应该那样做.

如果基于param的/ else语句为true或false,有没有更好的方法呢?

调试参数的值为true,没有值,或者值为false(就URL而言).

sep*_*p2k 50

params以字符串形式出现,所以你需要比较"true",而不是true.


tox*_*xaq 32

如果你不想重新发明轮子,可以使用ActiveRecord检查真值的方法(这是在ActiveRecord对象中传递params时使用的方法)

Rails 3-4.1

if ActiveRecord::ConnectionAdapters::Column.value_to_boolean(params[:debug])
    do xyz
else
    do abc
Run Code Online (Sandbox Code Playgroud)

Rails 4.2.0

ActiveRecord::Type::Boolean.new.type_cast_from_database(params[:debug])
Run Code Online (Sandbox Code Playgroud)

Rails 5

ActiveModel::Type::Boolean.new.cast(params[:debug])
Run Code Online (Sandbox Code Playgroud)

可能值得帮助包装,但从来没有那么灵活:

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'
Run Code Online (Sandbox Code Playgroud)

自定义扩展

有些人对扩展核心类感到不满,但这确实符合DRY原则.

# config/initializer/boolean.rb
class Boolean
  def self.parse(value)
    ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后使用像

if Boolean.parse(params[:debug])
  then xyz
Run Code Online (Sandbox Code Playgroud)


Jak*_*ake 6

从Rails/ActiveRecord 4.2.0开始

if ActiveRecord::Type::Boolean.new.type_cast_from_user params[:debug]
  do xyz
else
  do abc
end
Run Code Online (Sandbox Code Playgroud)

在Rails 5中它是:

if ActiveModel::Type::Boolean.new.cast params[:debug]
  do xyz
else
  do abc
end
Run Code Online (Sandbox Code Playgroud)


Ed *_* S. 5

但无论出于什么原因,if语句似乎没有像它应该那样做.

我几乎可以保证它正在做它应该做的事情.当事情没有意义时,我们的一个假设是错误的.

值实际上是布尔值还是字符串(或其他东西?).如果值是一个字符串,那么当然与布尔值true 的比较将失败.尝试比较'true',看看是否有效.