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

我每个月有大约十种不同类型的收入要显示,所以如果我能以这种方式将其干燥,它将把数百行重复的代码变成一个非常小的页面。

4

3 回答 3

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}
于 2013-07-08T15:09:10.753 回答
2

做:

@months.each{|m| =instance_variable_get(:"@#{m}_direct_by_activation_date")

但是,最好使用哈希:

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

#in view
@months.each do |m| 
   =@direct_incomes[m] 
于 2013-07-08T15:09:40.860 回答
0

考虑这个例子:

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

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

@m.each { |m| puts eval "@"+m+"_income" } => 1000, 500
于 2013-07-08T15:11:50.343 回答