rails 6 сохранение данных в несколько таблиц с одного контроллера

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я все еще новичок в rails. У меня есть сайт, который позволяет директорам турниров проводить онлайн-регистрацию. Когда они настраивают форму регистрации, они могут добавлять пользовательские поля для разных разделов, таких как базовая информация, разделение и т. Д. Эта часть работает, но когда пользователь переходит к форме регистрации, я могу вставить поля в форму, но я не знаю, как сохранить их в отдельную таблицу. У меня есть таблица участников, а пользовательские поля находятся в таблице полей.

Когда пользователь регистрирует или редактирует свою регистрационную информацию, как мне сохранить входные данные для пользовательских полей в отдельной таблице. У меня есть таблица с именем field_answers с participant_id, field_id и answer, но я не могу понять, как сохранить ответы от participants_controler .

Ниже приведена форма для основного раздела формы регистрации. Раздел @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 %>
 

Вот мой participants_controller.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'}amp;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
 

Я был бы признателен за любую помощь.

Редактировать: я отредактировал свои параметры participant_params в контроллере, чтобы:

 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
 

Когда я отправляю, все правильные поля добавляются в таблицу участников, но ничего в таблицу participant_fields. И в журналах я получаю разрешение

 parameters: :answer, :field_id
 

Комментарии:

1. Можете ли вы вставить свой текущий код контроллера, пожалуйста

2. Я добавил это в сообщение. Спасибо,

3. Если основной объект формы имеет has_many :basics связь, вы должны иметь возможность использовать f.fields_for :basic do и accepts_nested_attributes_for и позволить rails обрабатывать идентификаторы / имена uniq и создавать целую группу объектов в разных таблицах. apidock.com/rails/ActionView/Helpers/FormHelper/fields_for

4. Я пробовал это, но получил недопустимые параметры : :answer , :field_id, все остальное добавляется в таблицу участников, но ничего в таблицу participant_fields. Я редактирую сообщение, чтобы вы могли его там увидеть.

5. Проверьте параметры, поступающие в ваш терминал. participant_fields_attributes это обычный способ, которым это будет работать, но, возможно, они поступают каким-то другим способом. К вашему сведению, Cocoon — это gem, который обрабатывает вложенные атрибуты в форме, и у GoRails есть видео , в котором показано, как создать его с нуля с помощью StimulusJS.