首页 > 解决方案 > 无法使用“accepts_nested_attributes_for”创建关联/嵌套子记录

问题描述

尝试使用“accepts_nested_attributes_for”通过父级创建关联的子记录时出现以下错误:

ActiveRecord::RecordInvalid(验证失败:调查问题详情调查不能为空,调查问题详情活动详情必须存在):

想知道我是否遗漏了自动创建子记录的任何部分?

示例输入:(以下输入中的前 4 个键在保存前合并到 params 哈希中)

{:organization_id=>"hardcoded", :activity_library_type=>0, :created_by=>"hardcoded", :updated_by=>"hardcoded", "activity_name"=>"ss-28", "description"=>"", "content_path_url"=>"", "activity_status"=>0, "activity_type"=>4, "group"=>"group", "code_level"=>"code", "topic"=>"topic", "解决方案"=>"解决方案", "survey_question_details_attributes"=>[{"question"=>"Question1", "order"=>1, "question_type"=>0}]}

参数:

params.require(:activity_detail).permit(:activity_name, :description, :content_path_url, :activity_status,:activity_type,:group, :code_level, :topic, :solution, :duration_seconds, :survey_question_details_attributes => [:id, :question , :order, :question_type,:_destroy])

下面是控制器和模型(每个活动都包含许多问题):

class ActivityController < ApplicationController
def create
    # Merged additional_attributes hash to content_params recieved from front end (first 4 keys mentioned above in sample input)
    full_activity_details_record = additional_attributes.merge(content_params)
    response = ActivityDetail.create(full_activity_details_record)
  end
end

class ActivityDetail < ApplicationRecord
  has_many :survey_question_details, dependent: :destroy, foreign_key: :survey_id
  accepts_nested_attributes_for :survey_question_details

  validates :activity_name, :organization_id,
            :activity_library_type, :activity_status, :activity_type,
            :created_by, :updated_by, presence: true
  validates :activity_name, uniqueness: { case_sensitive: false }, length: { maximum: 55 }
  validates :description, length: { maximum: 160 }

end


class SurveyQuestionDetail < ApplicationRecord
  belongs_to :activity_detail, foreign_key: :survey_id

  validates :question, :survey_id, :question_type, :order, presence: true
  default_scope { order(:order) }
end

标签: ruby-on-railsactiverecord

解决方案


由于您还没有分享您的观点,让我开始说话。

首先,您已经验证模型属性的存在为真,因此您会特别收到验证错误。

####in SurveyQuestionDetail model
###this is causing the error => Survey question details SURVEY can't be blank
##you must either pass the survey_id as hidden field or comment it out
validates :question, :survey_id, :question_type, :order, presence: true

此外,在您看来,您必须将fields_for用于表单中的嵌套属性

就像是

<%= form_with(@activity_detail: show, local: true) do |form| %>
  # Show name and label
  <%= form.fields_for :survey_question_detail do |s| %>
    <%= s.label :number %>
    <%= s.number_field :number %>
    ##can also include hidden fields to add other model...survey_id
  <% end %>
  # Submit Button
<% end %>

希望这可以帮助。


推荐阅读