我有3个模型Item接受嵌套的问题和问题属性接受嵌套的答案属性。我正在尝试以相同的形式创建一个有问题和答案的项目。
item.rb的
class Item < ActiveRecord::Base
has_many :questions, dependent: :destroy
accepts_nested_attributes_for :questions
end
question.rb
class Question < ActiveRecord::Base
belongs_to :item
has_many :answers, dependent: :destroy
accepts_nested_attributes_for :answers
end
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强大的参数覆盖它。
我认为你的问题在于你强大的障碍:
def item_params
params.require(:item).permit(:id, :content, :kind, questions_attributes: [:content, :helper_text, :kind, answers_attributes: [:content, :correct]])
end
基本上,当您传递深层嵌套表单(您有多个依赖模型)时,您必须将属性作为其他模型属性的一部分传递。你把params分开了
我遇到了类似的问题,虽然理查德佩克的回答也帮助了我,但有一件事让我失踪了。
如果您是深度嵌套,则需要指定嵌套项的父级的id。在这种情况下创建一个answers
你需要使用questions
明确q.input :id
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