RoR: Почему это утверждение if не работает? - PullRequest
0 голосов
/ 17 июля 2010

Почему второй оператор if не выполняется в следующем блоке кода?Вывод из консоли указывает, что закрытый параметр равен 0, поэтому он должен быть передан?Закрытый параметр из флажка в новой форме, который я использую для установки логического поля в модели.

if (((params[:note])[:text]) != "")
  logger.debug("passed first test")
  logger.debug(((params[:note])[:private]))
  if (((params[:note])[:private]) == 0)
    logger.debug("passed second test")
  end
end

консольный вывод

passed first test
0
Completed in 61ms (DB: 1) | 302 Found [http://localhost/notes]

Спасибо за чтение

Ответы [ 2 ]

4 голосов
/ 17 июля 2010

Поля формы представлены в виде строк, поэтому params[:notes][:private] будет содержать "0", а не 0.

Вы можете использовать либо params[:notes][:private] == "0", либо params[:notes][:private].to_i == 0, чтобы получить сравнение, которое вы ищете.

Если вы хотите обрабатывать нецелые значения (включая пустые строки и пропущенные значения) иначе, чем 0, вы не должны использовать String#to_i. Я бы порекомендовал проверить значение String в этих случаях.

Вы можете использовать Object#inspect (как упомянуто @ sepp2k) и Object#class при отладке, чтобы получить лучшее представление о типах вещей. При использовании script/console я нахожу ap (или pp) весьма удобным.


Примечание: в Ruby вам не нужно так много скобок. Вот ваш пример после небольшой очистки:

unless params[:note][:text].blank?
  logger.debug "passed first test"
  logger.debug params[:note][:private].inspect
  if params[:note][:private].to_i == 0
    logger.debug "passed second test"
  end
end
1 голос
/ 17 июля 2010

В тех случаях, когда два выражения печатают одно и то же, но не равны, у вас обычно есть разные типы.Например, "0", :"0" и 0 оба печатаются как 0, но на самом деле они не равны друг другу.

logger.debug(params[:note][:private].inspect) должны дать вам более значимый вывод, указывая типобъект, а также его содержимое (т. е. если это строка, заключенная в кавычки, если это символ, то начинается с двоеточия и т. д.).

Значения в params обычно являются строками, поэтомузначение params[:note][:private] очень вероятно "0", а не 0.

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