显示一个表单,其中包含要回答的问题列表

时间:2012-10-01 01:02:17

标签: ruby-on-rails haml

我有一个预定义问题的集合,以及应该回答所有这些问题的用户。所以视图应该是这样的:

= 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条件,但我希望rails有一个干净的方法来做到这一点。有人曾经遇到过这样的问题吗?没有其他办法可以做到这一点,但用自定义助手创建所有这些?提前致谢

更新

最后,感谢@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 个答案:

答案 0 :(得分: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到提供答案的哈希值。