Я хочу проверить, когда мой объект @objectname
не равен нулю, чтобы показать значения @objectname
else, чтобы показать, что никаких значений не найдено.
Я пробовал это:
<% if (@objectname != null) then %>
но я получаю сообщение об ошибке.
Я хочу проверить, когда мой объект @objectname
не равен нулю, чтобы показать значения @objectname
else, чтобы показать, что никаких значений не найдено.
Я пробовал это:
<% if (@objectname != null) then %>
но я получаю сообщение об ошибке.
it nil
в Ruby, а не null
. И этого достаточно, чтобы сказать if @objectname
проверить, не ноль. И нет then
. Синтаксис if
можно найти здесь:
http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Control_Structures#if
Вы можете проверить, нет ли объекта nil (null), вызвав его? или пустой?.
@object.present?
это вернет false, если проект представляет собой пустую строку или нуль.
или вы можете использовать
@object.blank?
Это то же самое, что и сейчас? с ударом, и вы можете использовать его, если вам не нравится "если". это вернет true для пустой строки или nil.
Теперь в Ruby 2.3 вы можете использовать оператор &.
("оператор одиночества"), чтобы одновременно проверять наличие nil
и доступ к значению.
@person&.spouse&.name
https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#Other_operators
Вместо этого используйте #try
, чтобы вам не приходилось постоянно проверять nil
.
http://api.rubyonrails.org/classes/Object.html#method-i-try
@person.try(:spouse).try(:name)
вместо
@person.spouse.name if @person && @person.spouse
В вашем примере вы можете просто заменить null
на 'nil, и он будет работать нормально.
require 'erb'
template = <<EOS
<% if (@objectname != nil) then %>
@objectname is not nil
<% else %>
@objectname is nil
<% end %>
EOS
@objectname = nil
ERB.new(template, nil, '>').result # => " @objectname is nil\n"
@objectname = 'some name'
ERB.new(template, nil, '>').result # => " @objectname is not nil\n"
Вопреки словам другого автора, вы можете видеть выше, что then
прекрасно работает в Ruby. Это не часто, но это хорошо.
#blank?
и #present?
имеют другие последствия. В частности, если объект отвечает на #empty?
, они проверят, является ли он пустым. Если вы перейдете в http://api.rubyonrails.org/ и поищете "пусто?", Вы увидите, для каких объектов он определен и как он работает. Глядя на определение для объекта, мы видим: "Объект пустой, если его ложная, пустая или строка пробела. Например, '', '', nil, [] и {} - все пустой ". Вы должны убедиться, что это то, что вы хотите.
Кроме того, nil считается ложным, а все, кроме false и nil, считается истинным. Это означает, что вы можете непосредственно поместить объект в оператор if, поэтому более каноническим способом написания вышеприведенного будет
require 'erb'
template = <<EOS
<% if @objectname %>
@objectname is not nil
<% else %>
@objectname is nil
<% end %>
EOS
@objectname = nil
ERB.new(template, nil, '>').result # => " @objectname is nil\n"
@objectname = 'some name'
ERB.new(template, nil, '>').result # => " @objectname is not nil\n"
Если вам явно нужно проверить nil
, а не false
, вы можете использовать метод #nil?
, для которого nil является единственным объектом, который заставит его возвращать true.
nil.nil? # => true
false.nil? # => false
Object.new.nil? # => false
Вы можете использовать простой флаг not для подтверждения этого. Пример
if [email protected]
Это вернет true, если @objectname равно nil. Вы не должны использовать оператор точки или значение nil, иначе он выдаст
*** NoMethodError Exception: undefined method 'isNil?' for nil:NilClass
Идеальная проверка на ноль будет выглядеть так:
[email protected] || @objectname.nil? || @objectname.empty?