Подтвердить что ты не робот

Как проверить, является ли параметр true или false?

Это действительно ломается мой мозг, но, возможно, я пытаюсь усердно.

Я передаю параметр через URL (example.com?debug=true)

Поэтому я в основном хочу сказать:

if params[:debug] == true
 do xyz
else
 do abc
end

Но по какой-то причине, если оператор просто не работает, похоже, что он должен.

Есть ли лучший способ сделать это, если оператор /else, основанный на параметре true или false?

Параметр debug будет либо иметь значение true, ни значение, либо значение false (по отношению к URL-адресу).

4b9b3361

Ответ 1

params входят как строки, поэтому вам нужно сравнить с "true", а не true.

Ответ 2

Вы можете использовать метод ActiveRecord для проверки правдивых значений, если вы не хотите изобретать колесо (это то, что используется при передаче параметров внутри объекта ActiveRecord

Рельсы 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])

Рельсы 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

Ответ 3

Так как 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

Ответ 4

Но по какой-то причине, если оператор просто не работает, похоже, что он должен.

Я почти гарантирую, что он делает именно то, что должен. Когда что-то не имеет смысла, одно из наших предположений неверно.

Действительно ли значение является логическим или является строковым (или что-то еще?). Если значение представляет собой строку, то, конечно, сравнение с логическим значением true завершится ошибкой. Попробуйте сравнить с "true" и посмотрите, работает ли это.