ruby-on-rails - rails 6 从一个控制器将数据保存到多个表中
问题描述
我对rails还是很陌生。我有一个网站,允许锦标赛总监主持在线注册。当他们设置注册表单时,他们可以为不同部分添加自定义字段,例如基本信息、部门等。该部分正在工作,但是当用户转到注册表单时,我可以将字段拉入表单但我没有不知道如何将它们保存到单独的表中。我有一个参与者表,自定义字段位于字段表中。
当用户注册或编辑他们的注册信息时,如何将自定义字段的输入保存到单独的表中。我有一个名为 field_answers 的表,其中包含参与者 ID、字段 ID 和答案,但不知道如何从参与者控制器中保存答案。
以下是注册表基本部分的表格。@basic.each 部分是自定义字段被拉入的地方,我猜我需要给字段提供唯一的名称,而不仅仅是回答然后保存它们,但我不知道该怎么做。
<%= form_with model: [@event, @participant], class: "shadow p-3 mb-3 rounded text-dark", local: true do |f| %>
<%= f.hidden_field :child_id, value: @cid %>
<%= f.hidden_field :user_id, value: current_user.id %>
<%= f.hidden_field :event_id, value: @tID %>
<%= f.hidden_field :basic_complete, value: 1 %>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :first_name %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :first_name, class: 'form-control', value: @part.first_name, placeholder: "First name" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :last_name %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :last_name, class: 'form-control', value: @part.last_name, placeholder: "Last name" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :date_of_birth %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.date_field :dob, class: 'form-control', value: @part.dob, placeholder: "Date of Birth" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :gender %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<label class="main">Female
<%= f.radio_button :gender, "female", checked: true if @part.gender == "female" %>
<span class="w3docs"></span>
</label>
<label class="main">Male
<%= f.radio_button :gender, "male", checked: true if @part.gender == "male" %>
<span class="w3docs"></span>
</label>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :address1 %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :address1, class: 'form-control', value: @part.address1, placeholder: "Address 1" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :address2 %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :address2, class: 'form-control', value: @part.address2, placeholder: "Address 2" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :city %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :city, class: 'form-control', value: @part.city, placeholder: "City" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :state %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :state, class: 'form-control', value: @part.state, placeholder: "State" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :country %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :country, class: 'form-control', value: @part.country, placeholder: "Country" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :zip %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :zip, class: 'form-control', pattern: "[0-9]*", value: @part.zip, placeholder: "Postal Code" %>
</div>
</div>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label :phone %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :phone, class: 'form-control', pattern: "[0-9]{3}-[0-9]{3}-[0-9]{4}", maxlength: "12", value: @part.phone, placeholder: "Phone" %>
</div>
</div>
<% @basic.each do |b| %>
<div class="form-group row">
<div class="col-md-2 col-sm-12 col-form-label">
<%= f.label b.name %>:<span class="text-danger">*</span>
</div>
<div class="col-md-10 col-sm-12">
<%= f.text_field :answer, class: 'form-control' %>
<%= f.hidden_field :field_id, value: b.id %>
<%= f.hidden_field :event_id, value: @tID %>
</div>
</div>
<% end %>
<div class="form-group row">
<div class="col-md-8 col-sm-12"></div>
<div class="col-md-4 col-sm-12">
<%= f.submit "Register", class: "profile_btn" %>
</div>
</div>
<% end %>
这是我的参与者控制器.rb:
class ParticipantsController < ApplicationController
before_action :event
before_action :participant, only: %i[create]
def new
@participant = @event.participants.new
if current_user
@user = User.find(current_user.id)
@children = @user.children
end
@basic = Field.where(event_id: @event.id, field_type: 'basic')
end
def create
byebug
if @participant.save
flash[:success] = 'Child was successfully created.'
#redirect_to edit_event_participant_path(@participant.id)
redirect_to "/events/#{@event.id}/participants/#{@participant.id}/edit?rt=#{@participant.child_id != nil ? 'child' : 'self'}&step=2"
else
byebug
flash[:notice] = @participant.errors.full_messages.join('<br />').html_safe
redirect_back(fallback_location: events_path)
end
end
def show
end
def edit
@participant = Participant.find(params[:id])
@child = Child.find(@participant.child_id)
@custom_basic = Field.find_by(event_id: @participant.event_id, field_type: 'basic')
end
def update
end
private
def event
@event = Event.find_by(id: params[:event_tourn_url])
end
def participant
@participant = event.participants.new(participant_params)
end
def participant_params
params.require(:participant).permit(:event_id, :user_id, :child_id, :first_name, :last_name, :dob, :gender, :address1, :address2, :city, :state, :country, :zip, :phone, :basic_complete)
end
end
我会很感激任何帮助。
编辑:我将控制器中的参与者参数编辑为:
def participant_params
params.require(:participant).permit(:event_id, :user_id, :child_id, :first_name, :last_name, :dob, :gender,
:address1, :address2, :city, :state, :country, :zip, :phone,
participant_fields_attributes: [:id, :participant_id, :field_id, :answer])
end
我的参与者模型是:
class Participant < ApplicationRecord
belongs_to :event
has_many :participant_fields
accepts_nested_attributes_for :participant_fields
当我提交时,所有正确的字段都会添加到参与者表中,但不会添加到参与者字段表中。在日志中我得到 Unpermitted
parameters: :answer, :field_id
解决方案
推荐阅读
- javascript - 如何根据国家名称而不是 ID 创建动态下拉列表
- c# - 将身份 UserId 属性添加到我的域实体中
- flutter - (Flutter, dart) 如何在 Listview 中选择特定的 Card 并将图标颜色从白色切换到绿色
- java - 如何在 ActiveMQ 中 X 天后丢弃消息?
- c# - 为什么 WebDrivermanager 在设置时会出错?
- .net - 在将对象添加到 csv 之前获取对象的值
- reactjs - 等待一个元素不出现
- c++ - boost numeric_cast 可以抛出的所有异常是什么?
- api - 参数 json_data 的 Zoho Sheet API 问题
- python - 将 (Lambda) 订阅放在 CW Logs 组上