簡體   English   中英

Rails中的嵌套模型表單

[英]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_optionsoption_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM