首页 > 解决方案 > 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

标签: ruby-on-rails

解决方案


推荐阅读