Почему Rails не генерирует исключение, когда мы получаем доступ к неопределенной переменной экземпляра в представлении? - PullRequest
0 голосов
/ 04 апреля 2019

Предположим, у нас есть следующая реализация:

приложение / контроллеры / cars_controller.rb

class CarsControllers < ApplicationController
  def index
    @test = '7'
  end
end

приложение / просмотров / автомобили / index.html.erb

My test variable is <%= @test %>.
Here is an undefined variable <%= @test2 %>.

Почему доступ к @ test2 не вызывает исключения (учитывая, что мы пытаемся получить доступ к переменной экземпляра)?

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Undefined instance variable значение всегда будет nil. Если вы получите к нему доступ, оно не сгенерирует никакого исключения, тогда как локальная переменная сгенерирует исключение, если оно не было определено, если вы хотите проверить, назначена ли переменная экземпляра или нет Вы можете использовать .present? метод.

Вот простой пример этого

Instance variable

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" 

Local variable

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"

Надеюсь, этого достаточно, чтобы понять концепцию

1 голос
/ 04 апреля 2019

В большинстве языков программирования переменные экземпляра должны быть объявлены до того, как они могут быть назначены.Ruby - диаметральная противоположность - переменные экземпляра не могут быть объявлены вообще.Вместо этого переменная экземпляра в Ruby появляется при первом назначении.

Поэтому доступ к переменной экземпляра, которая не была назначена, не вызывает ошибку.

@ test2 равен нулю, когда к нему обращаются до назначения.

См. Документы: https://www.sitepoint.com/common-trip-ups-new-rubyists-part/

1 голос
/ 04 апреля 2019

Это не представляет проблемы в вашем примере, потому что @test2 просто возвращает nil, когда не определено.

Вы можете проверить это в сеансе консоли irb:

2.6.2 :001 > @test2
 => nil

Однако ... если бы вы вызывали метод, предположительно предоставленный @test2, у вас возникла бы проблема:

2.6.2 :002 > @test2.name
Traceback (most recent call last):
        1: from (irb):2
NoMethodError (undefined method `name' for nil:NilClass)

В этом случае вы определенно получите сообщение об ошибке, когда Rails попытается отобразить представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...