我有一个包含预定义问题的集合和一个应该回答所有这些问题的用户。所以视图应该是这样的:
= 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?}