2012-10-01 5 views
0

나는 미리 정의 된 질문과 이러한 질문에 모두 대답해야하는 사용자가있는 모음집을 가지고 있습니다. 따라서보기는 다음과 같아야합니다.답변 목록에있는 양식 표시

= form_for @user do |f| 
    -#some code and then... 
    %table.table 
     - @questions.each do |q| 
     %tr 
      %td=q.name 
      %td 
      %input-# Here the answer of the user for the question 'q' 

따라서보기에는 각 질문에 대한 각 사용자 응답도 표시되어야합니다. 내 문제는 첫 번째 인스턴스에 어떤 대답이 없을 것을, 그래서 같은 것을 사용하지 수 : 아무것도 표시하지 않도록 어떤 답변도하지 않습니다이 경우

= form_for @user do |f| 
    -#some code and then... 
    %table.table 
     - @user.answers.each do |answer| 
     = f.fields_for :answers, answer do |a| 
      %tr 
      %td= answer.question.name 
      %td=a.number_field :result 

합니다. 답변이있을지라도 모든 질문을 사용자에게 보여줘야합니다. 빈 값을 사용하여 응답을 미리 초기화 할 수는 있지만 빈 값만있는 레코드를 많이 갖고 싶지는 않습니다. 대부분의 질문은 사용자가 대답하지 않을 수도 있습니다. 또 다른 질문은 순서가 있고 나는 @user.answers.each 루프 (예, 쿼리를 수정할 수 있으므로 정렬 될 수 있지만, 뭔가를 위해 너무 많이 조정할 것입니다.)로 정렬 할 방법을 모른다는 것입니다. .단순한?). 일반적으로 메인 루프는 이고 @user.answers.each이 아야합니다.

필자는 필드를 수동으로 생성하는 것과 같이 몇 가지 불쾌한 방법으로 생각했습니다. 여러 가지 if/else 조건이 있지만 레일이이를 수행 할 수있는 확실한 방법을 원합니다. 누군가가 전에 이런 문제를 겪었습니까? 그렇게 할 수있는 다른 방법은 없지만 맞춤 헬퍼를 사용하여이 모든 것을 만들 수 있습니까? 컨트롤러에서

%table.table 
    - @questions.each_with_index do |q, i| 
    %tr 
     %td= q.name 
     %td 
     - answer = @user.answers.detect{|a| a.question.try(:id) == q.id} 
     = number_field_tag "user[answers_attributes][#{i}][result]", (answer && answer.result) 
     = hidden_field_tag "user[answers_attributes][#{i}][id]", (answer && answer.id) 
     = hidden_field_tag "user[answers_attributes][#{i}][question_id]", q.id 

, 다음 줄에, 청소에 충분했다 : 끝에서 미리

업데이트

감사드립니다, 감사 @saverio 대답에, 나는 다음과 같이 왼쪽 모든 비어있는 값 :

params[:user][:answers_attributes].delete_if{|k,v| v[:result].blank? && v[:id].blank?} 

답변

1

@questions 이상의 루프와 각 단계에서 해당 답변의 필드가 표시됩니다. 답변이 제공되어있는 경우, 당신은 제공된 대답 질문의 ID에서 해시 될 params[:user][:answers]을 구문 분석해야 컨트롤러에서 사전로드 된 텍스트

= form_for @user do |f| 
    -#some code and then... 
    %table.table 
     - @questions.each do |q| 
     - answer = @user.answers.detect {|a| a.question.name == q} 
     %tr 
      %td= q.name 
      %td= text_field_tag "user[answers][#{q.id}]", (answer && answer.text) 

로 보여줍니다.

+0

도움을 주셔서 감사합니다. –

+0

당신을 진심으로 환영합니다! – rewritten