在控制器中,我有一个数组,其中包含一年中几个月的简短版本:
@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 :(得分:5)
您可以使用instance_variable_get
获取实例变量的值,如下所示:
- @months.each do |m|
= instance_variable_get("@#{m}_direct_income")
但你应该考虑使用Hash,并将数据存储在这样的东西中:
@data = {
april: {
partner_income: 123,
direct_income: 456
}, may: {
...
}
}
然后做:
- @data.each do |month, data|
Month #{month}
- data.each do |key, value|
#{key} = #{value}
答案 1 :(得分: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]
答案 2 :(得分:0)
考虑这个例子:
@m = ["jan","feb"]
@jan_income = 1000
@feb_income = 500
eval "@"+@m[0]+"_income" #=> 1000
@m.each { |m| puts eval "@"+m+"_income" } => 1000, 500