首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails/Ruby错误地显示未定义的变量

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

Stack Overflow用户
提问于 2016-10-21 20:28:15
回答 2查看 99关注 0票数 3

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

代码语言:javascript
复制
pry(#<TasksController>)> Rails.configuration.hardcoded_current_user_key
=> "dev"

但它似乎不是定义的:

代码语言:javascript
复制
pry(#<TasksController>)> defined?(Rails.configuration.hardcoded_current_user_key)
=> nil

然而,它可以很好地存储和测试它的价值:

代码语言:javascript
复制
pry(#<TasksController>)> tempVar = Rails.configuration.hardcoded_current_user_key
=> "dev"
pry(#<TasksController>)> defined?(tempVar)
=> "local-variable"

怎么一回事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-21 21:20:11

这是因为Rails配置实施器 respond_to?而不是respond_to_missing?,而defined?只配置认识 respond_to_missing?

代码语言:javascript
复制
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会这样做。

票数 4
EN

Stack Overflow用户

发布于 2016-10-21 21:02:19

您不应该在任何东西上使用defined?,只应该使用它的“存根”,或者换句话说,仅仅是这样:

代码语言:javascript
复制
defined?(Rails)

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

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

如果要测试是否分配了某项内容,则应使用以下方法:

代码语言:javascript
复制
Rails.configuration.hardcoded_current_user_key.nil?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40184952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档