7

我有3個模型接受問題和問題的嵌套屬性的項目接受嵌套屬性的答案。我試圖用相同的形式創建一個有問題和答案的項目。Deep Nested Rails 4表格

item.rb的

class Item < ActiveRecord::Base 
    has_many :questions, dependent: :destroy 
    accepts_nested_attributes_for :questions 
end 

question.rb

answer.rb

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 

item_controller.rb

class ItemsController < ApplicationController 
    def new 
     @item = @repository.items.new 
     questions = @item.questions.build 
     answers = questions.answers.build 
    end 

    def create 
     @item = Item.new(item_params) 
     if @item.save 
      redirect_to @item, notice: '...' 
     else 
      render action: 'new' 
     end 
    end 

    private 
    def item_params 
     params.require(:item).permit(:id, :content, :kind, :questions_attributes => [:content, :helper_text, :kind], :answers_attributes => [:content, :correct]) 
    end 
end 

_form.haml

= simple_form_for(@item) do |f| 
    = f.input :kind 
    = f.input :content 
    = f.simple_fields_for :questions do |q| 
     = q.input :content 
     = q.simple_fields_for :answers do |a| 
      = a.input :content 
    = f.submit 

的形式被正確顯示和它正確保存的問題模型。雖然我似乎無法保存答案

我已經看過很多在線幫助,但沒有一篇介紹Rails 4強參數。

回答

10

我覺得你的問題是你堅強的PARAMS:

def item_params 
     params.require(:item).permit(:id, :content, :kind, questions_attributes: [:content, :helper_text, :kind, answers_attributes: [:content, :correct]]) 
end 

基本上,當你傳遞一個深嵌套的表格(在這裏你有多個相關模型),你必須要通過的屬性的一部分另一個模型的屬性。你有單獨的參數

+1

很好的解釋+1 –

+0

我想這將是例子類似這樣的答案,但感謝。 – etusm

0

我碰到類似的問題,雖然理查德佩克的答案也幫助了我,但還有一件事對我來說是缺少的。

如果你是深嵌套,你需要指定嵌套項目的父代的ID。在這種情況下創建一個answers您需要使questions ID明確與q.input :id,否則您將遇到此error

= simple_form_for(@item) do |f| 
    = ... 
    = f.simple_fields_for :questions do |q| 
     = ... 
     = q.input :id 
     = q.simple_fields_for :answers do |a| 
      = ... 
    = f.submit