在调试控制台中,当应用程序运行时(使用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"怎么一回事?
发布于 2016-10-21 21:20:11
这是因为Rails配置实施器 respond_to?而不是respond_to_missing?,而defined?只配置认识 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推荐与method_missing一起实现respond_to_missing?,我也想知道为什么Rails会这样做。
发布于 2016-10-21 21:02:19
您不应该在任何东西上使用defined?,只应该使用它的“存根”,或者换句话说,仅仅是这样:
defined?(Rails)除此之外的任何东西都是非常不寻常的,我甚至不确定它是否有效。
defined?不是一个方法,而是一个结构,它测试以下事物是否被定义为变量、常量或方法等。它不会评估您的代码,它只会测试它的原样。这意味着方法调用不会发生,因此不能被链接。
如果要测试是否分配了某项内容,则应使用以下方法:
Rails.configuration.hardcoded_current_user_key.nil?https://stackoverflow.com/questions/40184952
复制相似问题