【问题标题】:accepts_nested_attributes_for not creating nested resource?Accepts_nested_attributes_for 不创建嵌套资源?
【发布时间】:2014-02-25 19:20:14
【问题描述】:

我有一个has_many 测验的曲目和一个测验has_many 问题。

quiz.rb:

class Quiz < ActiveRecord::Base
  belongs_to :track
  has_many :questions, dependent: :destroy
  accepts_nested_attributes_for :questions
end

question.rb:

class Question < ActiveRecord::Base
  belongs_to :quiz
end

quizzes_controller.rb:

def new
  @quiz = Quiz.new
  @track = Track.find(params[:permalink])
  @course = Course.find(@track.course_id)

  3.times { @quiz.questions.build }
end

def create
  @track = Track.find(params[:permalink])
  @quiz = @track.quizzes.build(quiz_params)
  @course = Course.find(@track.course_id)
  if @quiz.save
    flash[:success] = 'Quiz successfully created'
    redirect_to quiz_path @quiz
  else
    redirect_to track_path @track
  end
end

private

def quiz_params
  params.require(:quiz).permit(:name, :information, :order, 
                               :permalink, :user_id,
                               questions_attributes: [:id, :content])
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"}

当我按下提交时,测验已创建,但未创建问题。

新参数:

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

【问题讨论】:

    标签: ruby-on-rails forms nested-forms nested-attributes


    【解决方案1】:

    我认为问题出在accepts_nested_attributes_for:

    reject_if: proc { |q| q['name'].blank? }
    

    如果content 为空,您可能应该拒​​绝实例(考虑请求参数):

    reject_if: proc { |q| q['content'].blank? }
    

    【讨论】:

    • 删除完全没有区别,在添加之前错误仍然发生。
    • 不可能,我仍然认为您的问题是拒绝带有空白名称的问题,这是有道理的,因为您不允许在 questions_attributes: [:id, :content] 中使用名称,并且实例被拒绝(经过测试的 Rails 4.0.2)。
    【解决方案2】:

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

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

    【讨论】:

    • 我认为这不是原因,但reject_if 选项拒绝所有问题,因为名称为空白。除非您有一些初始化程序或回调更改 name 属性。
    • @markets 不可能,正如我已经说过的,当它被删除时,错误仍然会发生。
    • 您能再试一次吗?在请求之前重新启动服务器。无论如何,我相信如果您添加reject_if: proc { |q| q['content'].blank? }(或一些模型验证)会更好。我在 Rails 4.0.2 中重新创建了测试,它按我说的那样工作。
    • 我现在也转到了 Answers,并且 strong_params 已添加到页面底部,我重新启动了服务器并使用了您建议的 proc,但它仍然不起作用。
    • 你使用什么版本的 Rails?很奇怪,它适用于我指向 4.0.2。我还找到了这个链接stackoverflow.com/questions/20917161/…,params 似乎定义得很好。
    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2013-10-16
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多