2011-10-17 34 views
0

我有一個方法,在我的應用程序的許多地方都使用過,在一些控制器和其他模型中都有。在方法中使用常量作爲參數?

class MyClass 
    LONG_CONSTANT_1 = "function(x) { some_long_js_function }" 
    LONG_CONSTANT_2 = "function(x) { another_really_long_js_function }" 

    def self.my_group_method(my_constant) 

    count = MyClass.collection.group(
     :keyf => my_constant, 
     :reduce => "function(x, y) {y.count += x.count;}" 
    ) 

    end 
end 

因此,即使所謂的內部my_group_method該方法涉及到MongoDB的,問題是本身都沒有關係,基本上我希望能夠調用

MyClass.my_group_method(LONG_CONSTANT_2) 

MyClass.my_group_method(LONG_CONSTANT_1) 

(實際上有幾個常量需要,但例子只有2個)

不幸的是我在這裏的實施導致錯誤:NameError: wrong constant name LONG_CONSTANT_1

在如何最好地實現這種行爲的任何想法?我可能會有幾個很長的常量(實際上JS函數是作爲發送到MongoDB的字符串),我在這裏使用的設計模式有什麼問題?

任何幫助將不勝感激!

回答

1

聽起來像你有常量的範圍問題。你要調用的類方法爲:

MyClass.my_group_method(MyClass::LONG_CONSTANT_1) 
MyClass.my_group_method(MyClass::LONG_CONSTANT_2) 

我能得到這個NameError:

uninitialized constant Object::LONG_CONSTANT_1 (NameError) 

從結構上類似於你的代碼,但不是一個「錯誤常量名」的錯誤的東西。

如果所有的命名空間爲常數實在是太多了,那麼你可以記錄預期輸入(可能爲符號),然後你的類中:

INPUTS = (
    :long_symbol_1 => LONG_CONSTANT_1, 
    :long_symbol_2 => LONG_CONSTANT_2 
) 

# Frobnicate the pancakes. 
# 
# The `which` argument should be `:long_symbol_1` or `:long_symbol_2`. 
# etc. 
def self.my_group_method(which) 
    str = INPUTS[which] 
    raise ArgumentError => "No idea what you're talking about" if(!str) 
    #... continue on 
end 

這種方法能給你一些參數的安全,你的好常量,並避免在呼叫者中使用MyClass::作爲參數的前綴。

相關問題