2010-07-17 5 views
0

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

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] 

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

ответ

4

Поля формы представляются в виде строк, поэтому 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 
+0

Спасибо за ваш ответ. Спасибо также за вашу заметку, я довольно новичок в RoR, теперь мой код выглядит намного красивее! – ben

+0

Я бы не просто бросил 'params [: note] [: private] .to_i == 0'. Попробуйте 'nil.to_i' или' 'Не число" .to_i', это может привести к некоторым головным болям в будущем – Chubas

+0

@Chubas Да, все, что не анализируется как целое число, будет давать '0' в качестве результата. Это стоит отметить. Как правило, для числовых параметров, вас интересует, если что-то отличное от нуля или нет. –

1

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

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

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

Смежные вопросы