ruby-on-rails - 无法使用“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
解决方案
由于您还没有分享您的观点,让我开始说话。
首先,您已经验证模型属性的存在为真,因此您会特别收到验证错误。
####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 %>
希望这可以帮助。
推荐阅读
- ios - ios本地通知-摆脱锁定屏幕上的“通知”文本
- javascript - Cordova 相机插件适用于模拟器,而不适用于 Android 设备
- amazon-web-services - 如何使用 Terraform 的 aws_ssm_document 在目标 VM 上运行 powershell 脚本
- javascript - 我的手风琴菜单代码有问题吗?
- python - 使用用户输入关闭 StreamConn
- javascript - “在‘@zxing/browser’中找不到导出‘BrowserMultiFormatReader’
- c++ - setField 到重复组
- leaflet - 如何设置 Openstreetmap 的样式?
- python-3.x - 将代码从 FOR 循环转换为 WHILE 循环
- python - 递归返回变量值