2013-07-08 116 views
1

在控制器我有一個包含一年中的幾個月的短暫版本的數組:如何獲得一個字符串作爲變量?

@months = ['apr', 'may', 'jun', 'jul', 'aug', 'sep', 'aug', 'sep', 'oct', 'nov', 'dec', 'jan', 'feb', 'mar'] 

然後我在控制器中定義的變量:

@apr_direct_income = 25300 
@may_direct_income = 22100 

和:

@april_partner_income = 1010 
@may_partner_income = 2020 

在視圖中我必須顯示所有這些字段,我可以做很長的路,但希望在Haml做這樣的事情來幹一點:

- @months.each do |m| 
    = "#{m}_direct_by_activation_date" 

它將輸出變量的名稱正確,但他們出來作爲一個字符串。我希望它意識到這是一個變量名,然後去獲得來自控制器的價值,所以不是顯示:

@apr_direct_income 
@may_direct_income 

它顯示:

25300 
22100 

我有十種不同類型的收入來每個月都會顯示一次,所以如果我能以這種方式幹這個,它會將數百行重複代碼變成一個非常小的頁面。

+0

(固定格式;你應該縮進代碼等4空格。) – Dogbert

+0

輝煌,這是煩我,謝謝你! –

+0

你的問題是什麼? – sawa

回答

5

你可以使用instance_variable_get這樣一個實例變量的值:

- @months.each do |m| 
    = instance_variable_get("@#{m}_direct_income") 

但你應該考慮使用這樣的哈希,並將數據存儲在這樣的事情:

@data = { 
    april: { 
    partner_income: 123, 
    direct_income: 456 
    }, may: { 
    ... 
    } 
} 

然後做:

- @data.each do |month, data| 
    Month #{month} 
    - data.each do |key, value| 
    #{key} = #{value} 
+0

不錯,謝謝,看起來好多了 –

+0

+1。我希望有人會使用'instance_variable_get'。 –

2

務必:

​​

但是,這將是更好地使用哈希:

@direct_incomes = {"may" => 25300, "apr" => 22100} 

#in view 
@months.each do |m| 
    [email protected]_incomes[m] 
0

考慮這個例子:

@m = ["jan","feb"] 
@jan_income = 1000 
@feb_income = 500 

eval "@"[email protected][0]+"_income" #=> 1000 

@m.each { |m| puts eval "@"+m+"_income" } => 1000, 500 
+3

這裏不需要評估。 – Dogbert

+0

'eval'是邪惡的。它甚至是邪惡的。 –

+0

這不是最好的答案,但也不是那麼糟。 – sawa

相關問題