我使用下面的語法定義常量在初始化中的Rails:動態常量定義
MyModule.const_set('MYCONSTANT','foobar')
它的工作原理,如果我啓動控制檯,寫
MyModule::MYCONSTANT
我收到foobar如預期。
問題是,當我嘗試在模型中調用它時,常量不存在。
D應該在哪裏動態定義我的常量,以及它在我的模型中可用?
如果我靜態定義它在我的lib/mymodule.rb它的作品,但我想在運行時定義一些常量。
我使用下面的語法定義常量在初始化中的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