Ruby on rails 接受\u嵌套的\u属性\u以不创建嵌套资源?

Ruby on rails 接受\u嵌套的\u属性\u以不创建嵌套资源?,ruby-on-rails,forms,nested-forms,nested-attributes,Ruby On Rails,Forms,Nested Forms,Nested Attributes,我有一首歌,有很多测验,一个测验有很多问题 quick.rb: class Quiz < ActiveRecord::Base belongs_to :track has_many :questions, dependent: :destroy accepts_nested_attributes_for :questions end 提交时的参数: {"utf8"=>"✓", "authenticity_token"=>"...", "quiz"=> {

我有一首歌,
有很多
测验,一个测验
有很多
问题

quick.rb:

class Quiz < ActiveRecord::Base
  belongs_to :track
  has_many :questions, dependent: :destroy
  accepts_nested_attributes_for :questions
end
提交时的参数:

{"utf8"=>"✓",
 "authenticity_token"=>"...",
 "quiz"=> {
   "name"=>"Test Quiz",
   "questions_attributes"=> {
     "0"=>{"content"=>"This is question 1?"},
     "1"=>{"content"=>"This is question 2?"},
     "2"=>{"content"=>""}
   }, "user_id"=>"1",
   "order"=>"3"
 }, "commit"=>"Submit",
 "permalink"=>"1-basics"}
当我按submit时,将创建测验,但不会创建问题

新参数:

def quiz_params
    params.require(:quiz).permit(:name, :information, :order, 
                                 :permalink, :user_id, 
                                 questions_attributes: [:id, :content, :_destroy, answers_attributes: [:id, :content, :_destroy]] )
  end

我认为问题出在
接受
的嵌套属性上:

reject_if: proc { |q| q['name'].blank? }
如果
内容
为空(考虑请求参数),您可能应该拒绝实例:


问题解决了。嵌套参数需要用花括号括起来:

def quiz_params
  params.require(:quiz).permit(:name, :information, :order, 
                               :permalink, :user_id,
                               { questions_attributes: [:id, :content] })
end

删除它完全没有什么区别,错误在添加之前仍然发生。不可能,伙计,我仍然认为您的问题是拒绝使用空名称的问题,这是有意义的,因为您不允许在问题属性中使用名称:[:id,:content],并且实例被拒绝(已测试Rails 4.0.2)。我认为这不是原因,但是<代码>拒绝>如果< /Cord>选项拒绝所有问题,因为空白名称。除非您有一些初始值设定项或回调函数更改了
name
属性。@markets不能这样做,因为我已经说过,删除该属性后,错误仍然会发生。您能再试一次吗?在请求之前重新启动服务器。无论如何,我相信如果您添加
reject_if:proc{q | q['content'].blank?}
(或一些模型验证)会更好。我在Rails 4.0.2中重新创建了这个测试,它正如我所说的那样工作。我现在也转到了答案,强参数被添加到页面底部,我重新启动了服务器并使用了您建议的
proc
,但仍然不工作。您使用的Rails版本是什么?非常奇怪,它对我来说是4.0.2。我还发现了这个链接,params似乎定义得很好。
reject_if: proc { |q| q['name'].blank? }
reject_if: proc { |q| q['content'].blank? }
def quiz_params
  params.require(:quiz).permit(:name, :information, :order, 
                               :permalink, :user_id,
                               { questions_attributes: [:id, :content] })
end