2010-11-23 78 views
15

我使用下面的語法定義常量在初始化中的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

回答

3

也許自動加載在開發模式是問題?

您的模型類是爲每個請求重新創建的,因此您需要一次又一次地創建常量。

問題會在生產模式中消失。您可以關閉開發模式下的自動加載,但這會強制您在代碼中進行每次更改後重新啓動服務器。

請參閱config/environments/development.rb:config.cache_classes = false(更改爲true)。

12

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

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

成以下塊application.rb中:

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

,我無意中發現了這個,因爲我試圖做「動態常量「。

我的目標是能夠使用特定的數據庫條目作爲常量。 (一旦插入,該行不會在特定實例上更改,但在不同實例上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