2012-05-11 2 views
0

질문이있는 값의 수에 따라 편집 페이지의 형식을 지정하는 코드가 있습니다.다른 값에 따라 Ruby 클래스에서 값을 가져 오는 방법

<% ([email protected]_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 %> 

매우 엉망이며 확장 할 수없는 것처럼 보입니다. case 문을 각 value1..n 클래스 변수에 대한 대소 문자가 필요하지 않은 무언가로 바꾸려면 어떻게해야합니까?

+1

당신은'X'는 숫자입니다 fooX' '라는 이름의 변수 집합을 때마다, 당신은 그들이 필드에서입니다 – Gareth

+0

코드 냄새가 그렇지 않으면 당신의 현재 상황에 대한 간단한 수정은 다음과 같이 될 수있다 데이터베이스를 변경할 수 없다. – Martlark

답변

0

저는 동적 코드 즉, 평가판을 통해 기존 스탠드에서 성공했습니다. 알 수없는 어떤 이유로

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

아베

에 의해 지적

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

이상 올바르게,이 작동하지 않을 것입니다.

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

그 경로를 가야한다면'send'를'eval'이 위험하다는 것을 고려해야 할 것이다. '@ answer.send ("value # {qvalue}")' –

+0

나는 그것을 살펴볼 것이다. – Martlark

+0

그것이 작동하지 않는 이유는 [문자열 보간]을 허용하기 위해 큰 따옴표를 사용해야한다는 것입니다. (http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Interpolation) –

1

해시에 답변 값을 입력하면 하나의 명령문으로 값을 가져올 수 있습니다. 이것을 헬퍼 메소드에 넣을 수 있습니다.

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

괜찮은 ORM (예 : DataMapper)을 사용하는 경우 데이터베이스 필드를 매핑 할 대상을 지정할 수 있어야합니다.

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

나는 괜찮은 ORM을 사용하지 않고있다. 적어도 나는 아직 내가하고있는 것을 충분히 이해하지 못한다. – Martlark

+0

아, 걱정하지 않으셔도됩니다. 귀하의 상황을 잘 모르겠지만, 당신이 준수해야 할 기존 (레거시) 데이터베이스를 다루고 있고 ORM을 사용할 예정이라면 DataMapper는 [멋진 기능] (http : //datamapper.org/docs/legacy.html)을 참조하십시오. ActiveRecord는 기존 스키마에 제약을받지 않을 때 가장 잘 작동합니다. 상황에 따라 살펴볼 가치가 있습니다. 행운을 빕니다 –

관련 문제