2011-05-02 39 views
1

我在我的user.rb文件中有以下常量,該文件用於我的某個表單中的選擇下拉菜單。它保存了一個數值。如何在Rails視圖中使用Ruby常量?

在我看來,當我獲得保存的數值時,我可以使用這個常量來檢索與它對應的名稱並顯示它嗎?或者我必須製作一個單獨的數組來處理這個問題?

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] 
] 

使用:

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

可以單獨如果你想抓住keysvalues,使得當你需要他們的個人方便,或者你可以查找的關鍵在於找到價值一如既往。

從那裏,你可以扭轉的哈希:

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

您可以爲您的視圖創建一個輔助方法,該方法使用此常量從整數中檢索熟練度。

你的助手可能是這樣的:

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

我認爲這需要'LANGPROFICIENCY.flatten [2 *(value-1)]' – 2011-05-02 21:46:24

+0

@Jeff - 是的,編輯:) – 2011-05-02 21:55:07

+0

perfecto ....謝謝! – stewart715 2011-05-02 22:07:09

1

如果你想要得到的名稱,

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

但如果你的陣列是有升序的數值,你有這裏有很多冗餘。相反,你有什麼,你可以把它簡化爲:

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

,做

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

有意思,謝謝。然而,在我看來,我得到了一個「未初始化的常量」錯誤......在我的模型中,我需要做些什麼來使其可用於我的視圖? – stewart715 2011-05-02 21:57:07

+0

你必須在調用它之前定義常量。因此,在代碼中放置'LANG ... ='。你可以把它放在類的前面,在那裏你有調用它的方法。如果你不打算在模型中使用它,你可以把它放在視圖中。 – sawa 2011-05-02 21:58:30

1

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: 現在你有一個匹配LANGPROFICIENCY的項的數組。

+0

格式化的道歉。出於某種原因,我無法讓編輯玩這個代碼塊。 – 2011-05-02 21:44:15

+0

當你創建一個答案時,你可以點擊橙色的「?」在編輯框的右上方獲取有關格式的提示。 – 2011-05-03 03:05:44

+0

@錫匠,謝謝,我知道......我認爲編輯器狀態與剪切和粘貼混淆。 – 2011-05-03 11:13:19

相關問題