2011-05-02 4 views
1

내 양식 중 하나의 선택 드롭 다운 메뉴에 사용되는 user.rb 파일에 다음과 같은 상수가 있습니다. 숫자 값을 저장합니다.Rails 뷰에서 루비 상수는 어떻게 사용합니까?

필자가보기에 저장된 숫자 값을 얻을 때이 상수를 사용하여 해당 이름을 검색하고 표시 할 수 있습니까? 아니면 이것을 처리하는 별도의 배열을 만들어야합니까?

LANGPROFICIENCY = [ 
    ["Elementary proficiency",   1], 
    ["Limited working proficiency",  2], 
    ["Professional working proficiency", 3], 
    ["Full professional proficiency", 4], 
    ["Native or bilingual proficiency", 5] 
] 

답변

3

먼저 해시는 이러한 종류의 데이터를위한 훌륭한 출발점입니다. 대신 :

LANGPROFICIENCY = [ 
    ["Elementary proficiency",   1], 
    ["Limited working proficiency",  2], 
    ["Professional working proficiency", 3], 
    ["Full professional proficiency", 4], 
    ["Native or bilingual proficiency", 5] 
] 

사용 : 당신은 개별적으로 필요로 할 때 편리하고, 별도로 당신이 원하는 경우 keys 또는 values을 잡아 수 있습니다, 또는 당신이 보는 업 할 수있는 키를 찾을 수

LANGPROFICIENCY = { 
    "Elementary proficiency"   => 1, 
    "Limited working proficiency"  => 2, 
    "Professional working proficiency" => 3, 
    "Full professional proficiency" => 4, 
    "Native or bilingual proficiency" => 5 
} 

항상 같은 가치.

Hash[*LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten] 

반환합니다 :

{ 
    1 => "Elementary proficiency", 
    2 => "Limited working proficiency", 
    3 => "Professional working proficiency", 
    4 => "Full professional proficiency", 
    5 => "Native or bilingual proficiency" 
} 

을 쉽게 역방향 조회를 수행 할 수있게

거기에서 당신은 해시를 취소 할 수 있습니다. 결과

LANGPROFICIENCY = LANGPROFICIENCY.merge(Hash[ *LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten ]) 

:

{ 
    "Elementary proficiency"   => 1, 
    "Limited working proficiency"  => 2, 
    "Professional working proficiency" => 3, 
    "Full professional proficiency" => 4, 
    "Native or bilingual proficiency" => 5, 
    1 => "Elementary proficiency", 
    2 => "Limited working proficiency", 
    3 => "Professional working proficiency", 
    4 => "Full professional proficiency", 
    5 => "Native or bilingual proficiency" 
} 

당신은 찾아 볼 수 있습니다 당신이 거기 안 충돌이있을 수 없습니다 알고 있다면

, 멀리 모든 것을 한 단계를 촬영 어느쪽으로 든, 앞으로 또는 뒤로.키 또는 값만 잡을 수있는 능력을 엉망으로 만들지 만 중간 단계 중 하나에서이를 해결할 수있는 방법을 찾아 낼 수 있습니다.

이 트릭을 항상 사용하거나이 테마를 변형합니다. 하나의 변수를 사용하여 앞뒤로 쉽게 매핑 할 수 있습니다.

이제 IRB 또는 Ruby에서 각 단계를 시도해 본 경우 "warning: already initialized constant LANGPROFICIENCY"에 대한 여러 경고가 표시됩니다. 그 대답은 상수 대신에 변수를 사용하는 것입니다. 게다가, LANGPROFICIENCY는 거의 읽을 수있는 변수 이름입니다. lang_proficiency 또는 비슷한 것을 사용하는 것이 좋습니다.

0

당신은 정수에서 실력을 검색하기 위해이 상수를 사용하여보기위한 도우미 메서드를 만들 수 있습니다. 당신이 이름을 얻고 싶은 경우에,

LANGPROFICIENCY.rassoc(2)[0] #=> "Limited working proficiency" 

def proficiency_from_value value 
    return LANGPROFICIENCY.flatten[2 * (value - 1)] 
end 
+0

LANGPROFICIENCY.flatten [2 * (value-1)]' –

+0

@Jeff - 예프, 편집 됨 : –

+0

perfecto .... 감사합니다! 흥미롭게도 – stewart715

1

을하지만 당신의 배열이 오름차순으로 숫자 값을 가지고 있다면, 당신은 :

도우미는 다음과 같이 수 여기에 많은 중복성이 있습니다. 대신 당신이 무엇을, 당신은 그것을 단순화 할 수 있습니다 :

LANGPROFICIENCY = [ 
    "Elementary proficiency", 
    "Limited working proficiency", 
    "Professional working proficiency", 
    "Full professional proficiency", 
    "Native or bilingual proficiency" 
] 

LANGPROFICIENCY[2-1] #=> "Limited working proficiency" 
+0

, 감사합니다. 그러나, 내보기에서 '초기화되지 않은 상수'오류가 발생했습니다 ... 내보기에서 사용할 수 있도록 내 모델에서 수행해야 할 작업이 있습니까? – stewart715

+0

상수는 호출하기 전에 정의해야합니다. 따라서 코드의 앞부분에'LANG ... = '을 넣으십시오. 그것을 호출하는 메소드가있는 클래스 본문에 어딘가에 넣을 수 있습니다. 모델에서 사용하지 않을 경우보기에 배치 할 수 있습니다. – sawa

1

LANGPROFICIENCY은 배열의 배열입니다 않습니다. 그것이 상수라는 것을 무시하십시오, 그것은 당신이 그것을 바꿀 수 없다는 것을 의미합니다. 지금 당신이 LANGPROFICIENCY의 항목과 일치하는 배열을 가지고 :

selected_entry = LANGPROFICIENCY.select {|entry| entry[1] == selected_id } 

>> LANGPROFICIENCY = [["Elementary proficiency",1], ["Limited working proficiency",2], ["Professional working proficiency",3], ["Full professional proficiency",4], ["Native or bilingual proficiency",5]] 
=> [["Elementary proficiency", 1], ["Limited working proficiency", 2], ["Professional working proficiency", 3], ["Full professional proficiency", 4], ["Native or bilingual proficiency", 5]] 

>> selected_id = 3 
=> 3 

>> selected_entry = LANGPROFICIENCY.select {|entry| entry[1] == selected_id }              
=> [["Professional working proficiency", 3]] 

>> selected_entry.flatten 
=> ["Professional working proficiency", 3] 

가 선택한 인덱스가 selected_id에 있고 값 3을 가지고 있다고 가정합니다.

+0

서식에 대해 사과드립니다. 나는 편집자가 어떤 이유로 코드 블록을 멋지게 재생할 수 없었습니다. –

+0

답변을 만들 때 주황색 "?"을 클릭 할 수 있습니다. 수정 상자의 오른쪽 상단에있는 형식에 대한 도움말을 참조하십시오. –

+0

@ 주석 남자, 고마워, 나는 알고있다. 나는 편집자 국가가 절단과 붙여 넣기와 혼동을 느낀다고 생각한다. –

관련 문제