Как вставить данные в две таблицы из одной формы - PullRequest
1 голос
/ 25 апреля 2020

Я новичок в RoR и ищу способ вставки данных из одной формы в две разные таблицы в одну вставку. Я пытался использовать accepts_nested_attributes_for

Database Association, пытаясь заставить его работать с этими двумя таблицами

class Morning < ApplicationRecord
has_many :foots
accepts_nested_attributes_for :foots  
end

class Foot < ApplicationRecord
belongs_to :morning
end

Просмотр формы с использованием самоцвета bootstrap_form, я не знаю, будет ли работать эта модель кода для этого

<%= bootstrap_form_with(model: @morning, url: morning_path, local: true) do |form| %>

<%= form.text_field :name, placeholder: "Nome", hide_label: true, required: true%>

<%= form.select :hour, [["Escolha um Horário", 0], ["06:00 às 06:30", "um"], ["06:30 às 
07:00", "dois"], ["07:00 às 07:30", "tres"]], { hide_label: true, required: true, wrapper: { class: 'has- 
warning', data: { foo: 'bar' } } }, { class: "selectpicker" } %>

<%= form.fields_for :foot do |foot| %>
        <%= foot.select :hour, [["Escolha um Horário", 0], ["06:00 às 06:30", "um"], ["06:30 
às 07:00", "dois"], ["07:00 às 07:30", "tres"]], { hide_label: true, required: true, wrapper: { class: 'has- 
warning', data: { foo: 'bar' } } }, { class: "selectpicker" } %>
    <% end %>

<%= form.submit "Registrar horário", class:"btn btn-primary", data: { disable_with: 
'Registrando....' } %>

<% end %>

Контроллер

class MorningController < ApplicationController

def new
    @morning = Morning.new
    @foot = @morning.foots.new 
end

def create
    @morning = Morning.create(morning_params)

        ActiveRecord::Base.transaction do
            @foot = @morning.foots.create(morning_params)
        end

    redirect_to morning_path
end

private
def morning_params
    params.require(:morning).permit(:name, :hour, foot_attributes: [ :name, :hour ])
end

end

1 Ответ

1 голос
/ 25 апреля 2020

Я видел, что есть отношение has_many, поэтому меняем форму и контроллер foot ==> foots

Как показано ниже: -

<%= bootstrap_form_with(model: @morning, url: morning_path, local: true) do |form| %>
.....
....

<%= form.fields_for :foots do |foot| %>
        <%= foot.select :hour, [["Escolha um Horário", 0], ["06:00 às 06:30", "um"], ["06:30 
às 07:00", "dois"], ["07:00 às 07:30", "tres"]], { hide_label: true, required: true, wrapper: { class: 'has- 
warning', data: { foo: 'bar' } } }, { class: "selectpicker" } %>
    <% end %>
.....
....
<% end %>

Затем в контроллере

def create
  @morning = Morning.new(morning_params)

  if @morning.save
    flash[:notice] = "Your custom message."
  else
    flash[:alert] = "Your custom message."
  end
  redirect_to morning_path
end

private

def morning_params
    params.require(:morning).permit(:name, :hour, foots_attributes: [ :name, :hour ])
end

### Редактировать Добавить поле имени в дочернюю форму

    <%= bootstrap_form_with(model: @morning, url: morning_path, local: true) do |form| %>

  <!-- Morning name in morning table -->
  <%= form.text_field :name, placeholder: "Morning name", hide_label: true, required: true%> 

  <%= form.select :hour, [["Escolha um Horário", 0], ["06:00 às 06:30", "um"], ["06:30 às 
     07:00", "dois"], ["07:00 às 07:30", "tres"]], { hide_label: true, required: true, wrapper: { class: 'has- 
     warning', data: { foo: 'bar' } } }, { class: "selectpicker" } %>

  <%= form.fields_for :foots do |foot| %>

    <!-- Foot name in foots table -->
    <%= foot.text_field :name, placeholder: "Foot name", hide_label: true, required: true%>

    <%= foot.select :hour, [["Escolha um Horário", 0], ["06:00 às 06:30", "um"], ["06:30 
     às 07:00", "dois"], ["07:00 às 07:30", "tres"]], { hide_label: true, required: true, wrapper: { class: 'has- 
     warning', data: { foo: 'bar' } } }, { class: "selectpicker" } %>

  <% end %>

  <%= form.submit "Registrar horário", class:"btn btn-primary", data: { disable_with: 
  'Registrando....' } %>

<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...