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 条件,但我希望 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?}
4

1 回答 1

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 到提供的答案的哈希值。

于 2012-10-01T01:22:33.697 回答