ruby-on-rails – active_admin目录中的常量警告重新声明

我正在使用active_admin,我在Rails 3应用程序中的应用程序中有一个目录管理员,其中包含模型和页面的声明.偶尔我也有一个类,当该类有一个常量时,像这样:

class Foo
  BAR = "bar"
end

然后,我在每个必须重新加载我的Rails应用程序中的代码的请求中收到此警告:

/Users/pupeno/helloworld/app/admin/billing.rb:12: warning: already initialized constant BAR

有什么想法以及如何避免这些警告?

解决方法

在纯Ruby中:

class A
  TEST = "foo"
end
puts A::TEST
# foo

class A
  TEST = "bar"
end
# (irb): warning: already initialized constant TEST
puts A::TEST
# bar

在Ruby中,您可以随时打开一个类并重新声明其中的任何内容.它仅针对常量发出警告,但它会继续进行并进行更改.

让我们甚至重新编写那些代码

class A
  TEST = "foo"
  TEST = "bar"
end
# (irb):3: warning: already initialized constant TEST

即使您没有真正更改常量,但只是将其设置为相同的值,警告也会出现.

class A
  TEST = "foo"
  TEST = "foo"
end
# (irb):3: warning: already initialized constant TEST

总的来说,它只是一个可以安全忽略的警告.

在Rails中:

在开发期间,Rails会重新加载应用中的任何更改代码.较新版本的Rails在确定哪些文件实际已更改时非常聪明,然后仅重新加载这些文件.所以假设你有这个控制器:

class TestController < ApplicationController
  FOO = "bar"

  def index
    ...
  end
end

如果您在此内部进行任何更改,则会重新加载此文件.重新加载文件时,会再次解析FOO =“bar”,并最终得到相同的警告.

解决方案:

>如果您正在使用Rails 3.0或3.1,请尝试active_reload gem并查看您的警告是否消失(它可能会在重新加载之前卸载您的类,这可能会导致警告消失)
>使用以下命令定义常量

FOO = "bar" unless const_defined?(:FOO)

只有当它不存在时,才会定义常量.所以你会避免警告.
>使用辅助方法定义常量自动执行此操作

module ConstDefiner
  def define_constant(name,value)
    const_set(name,value) unless const_defined?(name)
  end
end
ActionController::Base.send :extend,ConstDefiner
ActiveRecord::Base.send     :extend,ConstDefiner

# Now in all your controllers/models:
# instead of FOO = "value" unless const_defined?(:FOO),use:
define_constant :FOO,"value"

>这些警告仅在开发模式下发生.除非const_defined?(:FOO)正在制作中,否则你不需要所有的东西.通常不建议在生产中使用特定于开发的代码(除非它真的非常重要)
>请记住,当你说FOO =“bar”时,除非const_defined?(:FOO),那么即使你真的改变了FOO常数,它也不会在定义后重新加载.您必须停止并启动rails服务器才能重新加载它.但是,与实际代码相比,在开发期间修改常量的概率有点低,而不是非常频繁.如前所述,这不会以任何方式影响生产代码.

编辑:添加了active_reload gem的链接

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...