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)正在制作中,否则你不需要所有的东西.通常不建议在生产中使用特定于开发的代码(除非它真的非常重要) 编辑:添加了active_reload gem的链接 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |