2
votes

Pourquoi Rails ne lève-t-il pas d'exception lorsque nous accédons à une variable d'instance non définie dans la vue?

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)?


1 commentaires

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?


3 Réponses :


2
votes

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.


0 commentaires

3
votes

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


0 commentaires

2
votes

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 /


0 commentaires