动态常量定义

问题描述:

我使用下面的语法定义常量在初始化中的Rails:动态常量定义

MyModule.const_set('MYCONSTANT','foobar') 

它的工作原理,如果我启动控制台,写

MyModule::MYCONSTANT 

我收到foob​​ar如预期。

问题是,当我尝试在模型中调用它时,常量不存在。

D应该在哪里动态定义我的常量,以及它在我的模型中可用?

如果我静态定义它在我的lib/mymodule.rb它的作品,但我想在运行时定义一些常量。

+0

你犯了一个错字:MY_CONSTANT VS MYCONSTANT。这只是一个错误,或者这是你的代码中的问题? – Arsen7 2010-11-23 13:00:22

+0

错字在问题中,谢谢! – 2010-11-23 14:01:16

也许自动加载在开发模式是问题?

您的模型类是为每个请求重新创建的,因此您需要一次又一次地创建常量。

问题会在生产模式中消失。您可以关闭开发模式下的自动加载,但这会强制您在代码中进行每次更改后重新启动服务器。

请参阅config/environments/development.rb:config.cache_classes = false(更改为true)。

如果你想保持config.cache_classes = false, 你可以把

MyModule.const_set('MYCONSTANT','foobar') 

成以下块application.rb中:

config.to_prepare do 
MyModule.const_set('MYCONSTANT','foobar') 
end 

,我无意中发现了这个,因为我试图做“动态常量“。

我的目标是能够使用特定的数据库条目作为常量。 (一旦插入,该行不会在特定实例上更改,但在不同实例上ID可能不同)。

我想出了一个解决方案,可以适用于这种情况取决于你为什么要尝试拥有动态常量。下面是我的用例中的一个例子,但用别的东西替换属性定义是相当容易的。

class MyModel < ActiveRecord::Base 
    def self.MY_CONST 
    @my_const ||= MyModel.find_by(code: 'my_const_code') 
    end 
end 

这里就是我测试了它:

require 'test_helper' 

class MyModelTest < ActiveSupport::TestCase 
    test "mymodel constant defined" do 
    assert_equal MyModel.find_by(code: 'my_const_code'), MyModel.MY_CONST 
    end 
end