如何根据另一个值从Ruby类获取值

时间:2012-05-11 07:22:03

标签: html ruby-on-rails

我有一些代码可以根据问题的值来格式化编辑页面。

  <% (1..@question.qvalues_count.to_i).each do |qvalue| %>
    <% case qvalue
         when 1
          answer_value = @answer.value1
        when 2
          answer_value = @answer.value2
        when 3
          answer_value = @answer.value3
        when 4
          answer_value = @answer.value4
        when 5
          answer_value = @answer.value5
        end %>
       <label for="answer[value<%=qvalue%>]" class="fieldLabel" >Value<%=qvalue%></label>
      <input type="text" id="answer[value<%=qvalue%>]" name="answer[value<%=qvalue%>]" 
        value="<%=answer_value%>" 
      />
   <% end %>

看起来非常混乱,无法扩展。如何用不需要每个value1..n类变量的情况替换case语句?

3 个答案:

答案 0 :(得分:1)

将答案值放在哈希中,然后您可以使用一个语句获取值。你可以把它放在辅助方法中。

values = {1 => 'my value 1', 2 => 'my value'}
answer_value = values[qvalue]

答案 1 :(得分:0)

我在旧动态代码方面取得了成功,即:eval。

<% answer_value = eval( '@answer.value' + qvalue.to_s ) %>

或更准确地说,如Abe所指出的

<% answer_value = @answer.send( 'value'+qvalue.to_s) %>

由于某些原因未知,这不起作用。

<% answer_value = @answer.send( 'value#{qvalue}' ) %>

答案 2 :(得分:0)

如果您正在使用体面的ORM(例如DataMapper),您应该能够指定数据库字段映射到的内容。否则,对您当前情况的简单修复可能是这样的:

class Answer
  def value(i)
    self.send("value#{i}")
  end
end