Supposons que nous ayons l'implémentation suivante:
app / controllers / cars_controller.rb
My test variable is <%= @test %>. Here is an undefined variable <%= @test2 %>.
app / views / cars / index.html.erb
class CarsControllers < ApplicationController
def index
@test = '7'
end
end
Comment se fait-il que l'accès à @ test2 ne lève pas d'exception (étant donné que nous essayons d'accéder à une variable d'instance)?
3 Réponses :
Cela ne pose pas de problème dans votre exemple car @ test2 renvoie simplement nil lorsqu'il n'est pas défini.
Vous pouvez le vérifier dans une session de console irb:
2.6.2 :002 > @test2.name
Traceback (most recent call last):
1: from (irb):2
NoMethodError (undefined method `name' for nil:NilClass)
Cependant ... si vous appelez une méthode supposée être fournie par @ test2 alors vous auriez un problème: p >
2.6.2 :001 > @test2 => nil
Dans ce cas, vous recevriez certainement une erreur lorsque Rails essaierait de rendre la vue.
La valeur non définie de la variable d'instance sera toujours nil , si vous y accédez, elle ne lèvera aucune exception, tandis que la variable locale lèvera une exception si elle ne l'a pas définie, si vous voulez vérifier que la variable d'instance est affectée ou non, vous pouvez utiliser la méthode .present? .
En voici un exemple simple
Variable d'instance
2.5.1 :017 > undefined_local
Traceback (most recent call last):
1: from (irb):17
NameError (undefined local variable or method `undefined_local' for main:Object)
2.5.1 :018 > undefined_local.present?
Traceback (most recent call last):
1: from (irb):18
NameError (undefined local variable or method `undefined_local' for main:Object)
2.5.1 :019 > defined? undefined_local
=> nil
2.5.1 :020 > defined_local = "test"
=> "test"
2.5.1 :021 > defined? defined_local
=> "local-variable"
Variable locale
2.5.1 :009 > @undefined => nil 2.5.1 :010 > @undefined.present? => false 2.5.1 :011 > defined? @undefined => nil 2.5.1 :014 > @defined = "test" => "test" 2.5.1 :015 > @defined.present? => true 2.5.1 :016 > defined? @defined => "instance-variable"
J'espère que cela suffit pour comprendre le concept
Dans la plupart des langages de programmation, les variables d'instance doivent être déclarées avant de pouvoir être affectées. Ruby est le diamétral opposé - les variables d'instance ne peuvent pas du tout être déclarées. Au lieu de cela, une variable d'instance dans Ruby apparaît la première fois qu'elle est affectée.
C'est pourquoi l'accès à une variable d'instance qui n'a pas été affectée ne génère pas d'erreur.
@ test2 est nul lorsqu'il est accédé avant l'affectation.
Voir la documentation: https://www.sitepoint.com / common-trip-ups-new-rubyists-part /
Parce que c'est ainsi que fonctionne Ruby et qu'il peut être facilement confirmé dans une console IRB. Par conséquent, votre question ne m'est pas claire. Pouvez-vous expliquer pourquoi vous pensez que cela devrait générer une erreur?