0

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

  <% (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 语句?

4

3 回答 3

1

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

values = {1 => 'my value 1', 2 => 'my value'}
answer_value = values[qvalue]
于 2012-05-11T07:27:03.937 回答
0

I have success with the old stand by, dynamic code, ie: the eval.

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

or more correctly, as pointed out by Abe

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

for some reason unknown, this would not work.

<% answer_value = @answer.send( 'value#{qvalue}' ) %>
于 2012-05-12T00:28:55.773 回答
0

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

class Answer
  def value(i)
    self.send("value#{i}")
  end
end
于 2012-05-12T01:07:39.810 回答