[英]Nested model form in Rails
我正在嘗試創建一個可用於提交測驗答案的Web應用程序。 而且我在創建視圖文件時遇到了麻煩。
提交表單應如下所示 (很抱歉,SO不允許我在問題正文中插入圖片)。
這是Ryan Bates在Railscasts中討論的嵌套模型形式的情況,但是有一個重要的區別。 在瑞安·貝茨(Ryan Bates)的案例中,有一條簡單的關聯鏈:一個調查模型有很多問題,而每個問題有很多答案。
不過,我計划的要復雜一些。 在我的情況下,測驗有許多問題,而一個問題有許多答案,但是向用戶展示的是一個稱為“提交”的模型。 提交與用戶模型和應答模型相關聯,並且還具有一些其他信息。 在示意圖上,我的關聯如下所示 :
因此,我需要創建一個將模型(提交)與許多未關聯的模型(問題)和許多關聯的模型(答案)結合在一起的表格。 我可以為我的新/編輯視圖文件想到的是:
控制器:
# GET /tests/:test_id/submissions/new
def new
@quiz = Quiz.find(params[:quiz_id])
# the next four lines of code are to select a subset of questions
variant = choose_variant(@quiz)
@submission = Submission.new
@submission.variant = variant
@questions = Question.where (variant: variant)
@questions.each {|question| quiestion.answers.build}
end
視圖:
= form_for [@quiz, @submission] do |f|
= f.fields_for :answers do |builder|
= @questions.each do |question|
%p
= @question.text
= builder.label :answer_text, "Your answer"
= builder.text_area :answer_text
但這看起來並不正確:@ submission,@ question和答案之間沒有關聯。 如果提交與問題模型之間沒有直接關聯,請提出如何解決此問題的建議?
更新:
我現在可以在視圖中創建一個表單:
= form_for [@quiz, @submission] do |f|
- @questions.each do |question|
%p
= question.text
= f.fields_for :answer, question.answers.first do |builder|
= builder.label :text, "Answer"
= builder.text_area :text
麻煩的是,提交時,最后一個答案將覆蓋所有不明確的答案,並且在參數中我只能得到:
"submission"=>{"answer"=>{"text"=>"Answer to the last question"}}
更新2:
對於Marcelo Risoli(對不起,我沒有StackOverflow行為的煩惱,它不允許我寫其他評論)。 抱歉,起初我不太了解您的建議。 您的一行@questions.each { |q| @submission.answers.build question_id: q.id }
@questions.each { |q| @submission.answers.build question_id: q.id }
是個天才:它將answers
與控制器中的submission
(而不是視圖中的submission
相關聯,就像我最初嘗試的那樣。 會嘗試通過您的建議並寫回。 但是似乎這條線可以解決我所有的問題:-)
使用適當的聯接表。 建議您使用“答案”表作為用戶的實際答案。 將question_options
和option_groups
用於可能的問題答案。
建議您考慮基於https://stackoverflow.com/a/5858666/631619
只是用“調查”代替“測驗”
我做了一些非常相似的事情,我可以給你一些建議:
首先,我建議您使用cocoon ,嵌套形式不再被更新,並且我發現cocoon更加容易處理。
其次,提交不需要與問題相關聯,如果有必要,您可以通過has_many::through關聯來訪問給定提交的問題。
當您在form_for提交中使用fields_for:answers時,意味着新創建的submission_id將被輸入到答案中,現在您只需要輸入question_id,就可以通過隱藏的輸入來做到這一點,只需在控制器中執行以下操作即可:
@questions.each { |q| @submission.answers.build question_id: q.id }
然后將= builder.input :question_id, as: :hidden
添加= builder.input :question_id, as: :hidden
到表單中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.