2012-10-01 72 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循环(是的,我可以修改查询,所以它可以排序,但我会调整太多的东西.. 。简单?)。一般来说,主循环应该是@questions.each而不是@user.answers.each

我一直在思考一些讨厌的方式来做到这一点,像手动创建领域,有几个的if/else条件,但我希望的轨道有一个干净的方式来做到这一点。有人曾经遇到过这样的问题吗?有没有其他的方式来做到这一点,但用自定义助手创建所有这些?在此先感谢

更新

最后,感谢@saverio回答,我离开它,如下所示:

%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 

在控制器方面,与下一行,足够清洁所有空值:

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

回答

1

循环遍历@questions,并在每个步骤显示相应答案的字段。如果答案已经提供,它显示为预载的文本

= 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) 

在你就得解析params[:user][:answers],这将是从问题的ID的哈希所提供的答案控制器。

+0

感谢您的帮助:) –

+0

欢迎您! – rewritten