首页 > 解决方案 > 为什么当我们访问视图中未定义的实例变量时,Rails 不会抛出异常?

问题描述

假设我们有以下实现:

应用程序/控制器/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 不会引发异常(假设我们正在尝试访问实例变量)?

标签: ruby-on-railsruby

解决方案


未定义的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"

希望这足以理解这个概念


推荐阅读