动态常量定义
问题描述:
我使用下面的语法定义常量在初始化中的Rails:动态常量定义
MyModule.const_set('MYCONSTANT','foobar')
它的工作原理,如果我启动控制台,写
MyModule::MYCONSTANT
我收到foobar如预期。
问题是,当我尝试在模型中调用它时,常量不存在。
D应该在哪里动态定义我的常量,以及它在我的模型中可用?
如果我静态定义它在我的lib/mymodule.rb它的作品,但我想在运行时定义一些常量。
答
也许自动加载在开发模式是问题?
您的模型类是为每个请求重新创建的,因此您需要一次又一次地创建常量。
问题会在生产模式中消失。您可以关闭开发模式下的自动加载,但这会强制您在代码中进行每次更改后重新启动服务器。
请参阅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
你犯了一个错字:MY_CONSTANT VS MYCONSTANT。这只是一个错误,或者这是你的代码中的问题? – Arsen7 2010-11-23 13:00:22
错字在问题中,谢谢! – 2010-11-23 14:01:16