Как проверить, является ли параметр истинным или ложным? - PullRequest
28 голосов
/ 11 ноября 2009

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

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

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

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

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

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

Параметр отладки будет иметь значение true, никакого значения или значение false (в зависимости от URL).

Ответы [ 4 ]

49 голосов
/ 11 ноября 2009

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

31 голосов
/ 31 октября 2012

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

Рельсы 3-4.1

if ActiveRecord::ConnectionAdapters::Column.value_to_boolean(params[:debug])
    do xyz
else
    do abc

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

Пользовательское расширение

Некоторые люди недовольны расширением базовых классов, но это соответствует принципу СУХОЙ.

# 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
6 голосов
/ 26 января 2016

Начиная с 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
5 голосов
/ 11 ноября 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...