web-dev-qa-db-fra.com

Comment je peux vérifier si un objet est null dans Ruby sur Rails 2?

Je veux vérifier quand mon objet @objectname n'est pas égal à null pour afficher les valeurs du @objectname d'autre pour montrer qu'aucune valeur n'a été trouvée.

J'ai essayé ceci:

<% if (@objectname != null) then %>

mais je reçois une erreur.

41
George Panayi

c'est nilen Ruby, pas null. Et il suffit de dire if @objectname pour vérifier si ce n'est pas nul. Et pas de then. Vous pouvez trouver plus d'informations sur la syntaxe if ici:

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Control_Structures#if

56
Pavel Veller

Vous pouvez vérifier si un objet est nul (null) en appelant present? ou vide? .

@object.present?

cela retournera false si le projet est une chaîne vide ou nil.

ou vous pouvez utiliser

@object.blank?

c'est la même chose que présent? avec un coup et vous pouvez l'utiliser si vous n'aimez pas "sauf". cela retournera true pour une chaîne vide ou nil.

38
lesce

Maintenant, avec Ruby 2.3, vous pouvez utiliser &. opérateur ('opérateur solitaire') pour vérifier nil en même temps que l’accès à une valeur.

@person&.spouse&.name

https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#Other_operators


Utilisation #try à la place, vous n'avez donc pas besoin de continuer à rechercher nil.

http://api.rubyonrails.org/classes/Object.html#method-i-try

@person.try(:spouse).try(:name)

au lieu de

@person.spouse.name if @person && @person.spouse
12
Chloe

Dans votre exemple, vous pouvez simplement remplacer null par `nil et tout se passera bien.

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"

Contrairement à ce que disait l'autre affiche, vous pouvez voir ci-dessus que then fonctionne bien en Ruby. Ce n'est pas commun, mais c'est bien.

#blank? et #present? ont d'autres implications. Plus précisément, si l'objet répond à #empty?, ils vont vérifier si c'est vide. Si vous allez sur http://api.rubyonrails.org/ et recherchez "vide?", Vous verrez sur quels objets il est défini et comment cela fonctionne. En regardant définition sur objet , nous voyons "Un objet est vide s'il est faux, vide ou s'il s'agit d'une chaîne d'espacement, par exemple," "," ", nil, [] et {} sont tous vides. " Vous devez vous assurer que c'est ce que vous voulez.

De plus, zéro est considéré comme faux, et toute chose autre que faux et zéro est considérée comme vraie. Cela signifie que vous pouvez directement placer l’objet dans l’énoncé if. Une méthode plus canonique pour écrire ce qui précède serait alors:

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"

Si vous devez explicitement vérifier nil et pas false, vous pouvez utiliser le #nil? méthode, pour laquelle nil est le seul objet à renvoyer true.

nil.nil?          # => true
false.nil?        # => false
Object.new.nil?   # => false
5
Joshua Cheek

Vous pouvez utiliser le simple drapeau non pour valider cela. Exemple

if !@objectname

Cela retournera true si @objectname est nil. Vous ne devez pas utiliser d'opérateur de point ou une valeur nulle, sinon il jettera

*** Exception NoMethodError: méthode non définie `isNil? ' pour nil: NilClass

Un chèque nul idéal serait comme:

!@objectname || @objectname.nil? || @objectname.empty?
0
Vasanth Saminathan