在调试控制台中,当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"
发生了什么事?
答案 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_missing
是recommended,我也很想知道为什么Rails会这样做。
答案 1 :(得分:0)
除了“stub”之外,你不应该使用defined?
,换句话说,仅仅是这样:
defined?(Rails)
除此之外的任何事情都非常不寻常,我甚至不确定它是否有效。
defined?
不是一个方法,而是一个构造,用于测试以下事物是否被定义为变量,常量或方法等。它不会评估你的代码,它只是按原样测试它。这意味着方法调用不会发生,因此无法链接。
如果你想测试分配的东西,你应该使用它:
Rails.configuration.hardcoded_current_user_key.nil?