我有一个预定义问题的集合,以及应该回答所有这些问题的用户。所以视图应该是这样的:
= 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?}
答案 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到提供答案的哈希值。