2010-11-23 15 views
15

Ich bin in einer initializer in Rails mit folgenden Syntax eine Konstante definieren:Dynamische konstante Definition in Rails

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

Es funktioniert, wenn ich eine Konsole starten und schreibe

MyModule::MYCONSTANT 

I erhalten Foobar wie erwartet.

Das Problem ist, wenn ich versuche, es in einem Modell zu nennen, ist die Konstante nicht da.

Wo sollte D meine Konstante dynamisch definieren, damit sie auch in meinen Modellen verfügbar ist?

Wenn ich es in meinem lib/mymodule.rb statisch definiere, funktioniert es, aber ich möchte einige Konstanten zur Laufzeit definieren.

+0

Sie einen Tippfehler gemacht: MY_CONSTANT vs MYCONSTANT. Ist es nur ein Fehler in der Frage oder ist das Problem in Ihrem Code? – Arsen7

+0

Tippfehler in der Frage, danke! –

Antwort

3

Vielleicht Autoloading im Entwicklungsmodus ist das Problem?

Ihre Modellklasse wird für jede Anforderung neu erstellt, daher müssen Sie die Konstante immer wieder neu erstellen.

Das Problem würde nur im Produktionsmodus verschwinden. Sie können das automatische Laden im Entwicklungsmodus deaktivieren, aber dies wird Sie zwingen, den Server nach jeder Änderung in Ihrem Code neu zu starten.

Weitere Informationen finden Sie unter config/environments/development.rb: config.cache_classes = false (ändern Sie auf true).

+0

perfekt, das war das Problem. Vielen Dank :-) –

12

wenn Sie config.cache_classes = false behalten möchten, können Sie

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

in folgenden Block in application.rb setzen:

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

Ich habe auf diese stolperte, als ich zu tun versuchte " dynamische Konstanten ".

Mein Ziel ist es, einen bestimmten Datenbankeintrag als Konstante verwenden zu können. (Nach dem Einfügen ändert sich die Zeile an einer bestimmten Instanz nie, aber IDs können für verschiedene Instanzen unterschiedlich sein).

Ich habe eine Lösung gefunden, die sich auf diesen Fall anwenden lässt, je nachdem, warum Sie versuchen, dynamische Konstanten zu haben. Hier ist ein Beispiel in meinem Anwendungsfall, aber es ist ziemlich einfach, die Attributdefinition durch etwas anderes zu ersetzen.

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

Und hier ist, wie ich es getestet:

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 
Verwandte Themen