2011-10-17 3 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

어떤 아이디어? 나는 여러 개의 long 상수 (실제로는 JS 함수가 MongoDB로 보내지는 문자열로)를 가질 것이지만, 여기서 내가 사용하고있는 디자인 패턴에 대해 잘못된 점이 무엇입니까?

도움이 될 것입니다.

답변

1

상수에 범위 지정 문제가있는 것 같습니다. 나는이 나가서 설명하자면 NameError를 얻을 수

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

: 당신은 클래스 메소드를 호출 할 코드 아니지만 "잘못된 상수 이름"오류와 구조적으로 유사한에서

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::을 붙이면 안된다는 잡음을 피하십시오.

관련 문제