#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_for4. Я пробовал это, но получил недопустимые параметры : :answer , :field_id, все остальное добавляется в таблицу участников, но ничего в таблицу participant_fields. Я редактирую сообщение, чтобы вы могли его там увидеть.
5. Проверьте параметры, поступающие в ваш терминал.
participant_fields_attributes
это обычный способ, которым это будет работать, но, возможно, они поступают каким-то другим способом. К вашему сведению, Cocoon — это gem, который обрабатывает вложенные атрибуты в форме, и у GoRails есть видео , в котором показано, как создать его с нуля с помощью StimulusJS.