Rails / Ruby错误地显示未定义的变量

时间:2016-10-21 20:28:15

标签: ruby-on-rails ruby

在调试控制台中,当app运行时(使用binding.pry中断它),我可以看到我的变量Rails.configuration.hardcoded_current_user_key已设置:

pry(#<TasksController>)> Rails.configuration.hardcoded_current_user_key
=> "dev"

但它似乎没有 定义:

pry(#<TasksController>)> defined?(Rails.configuration.hardcoded_current_user_key)
=> nil

然而,它可以存储和测试其价值:

pry(#<TasksController>)> tempVar = Rails.configuration.hardcoded_current_user_key
=> "dev"
pry(#<TasksController>)> defined?(tempVar)
=> "local-variable"

发生了什么事?

2 个答案:

答案 0 :(得分:4)

这是因为Rails配置implements respond_to?但不是respond_to_missing?,而defined?recognizes respond_to_missing?

class X
  def respond_to?(name, include_all = false)
    name == :another_secret || super
  end

  private

  def method_missing(name, *args, &block)
    case name
    when :super_secret
      'Bingo!'
    when :another_secret
      'Nope.'
    else
      super
    end
  end

  def respond_to_missing?(name, include_all = false)
    name == :super_secret || super
  end
end

x = X.new
puts x.super_secret          # => Bingo!
p defined?(x.super_secret)   # => "method"
puts x.another_secret        # => Nope.
p defined?(x.another_secret) # => nil

respond_to_missing?一起实施method_missingrecommended,我也很想知道为什么Rails会这样做。

答案 1 :(得分:0)

除了“stub”之外,你不应该使用defined?,换句话说,仅仅是这样:

defined?(Rails)

除此之外的任何事情都非常不寻常,我甚至不确定它是否有效。

defined?不是一个方法,而是一个构造,用于测试以下事物是否被定义为变量,常量或方法等。它不会评估你的代码,它只是按原样测试它。这意味着方法调用不会发生,因此无法链接。

如果你想测试分配的东西,你应该使用它:

Rails.configuration.hardcoded_current_user_key.nil?