Rails: передача параметров вложенных атрибутов - PullRequest
0 голосов
/ 04 июля 2018

Итак, я работаю над проектом "Flight Booker" проекта Odin. https://www.theodinproject.com/courses/ruby-on-rails/lessons/building-advanced-forms. По сути, это то, на что это похоже, и у меня проблема с передачей вложенных атрибутов.

В первую очередь соответствующие модели:

class Booking < ApplicationRecord
  belongs_to :passenger
  belongs_to :flight
  accepts_nested_attributes_for :passenger
end

class Flight < ApplicationRecord
  has_many :bookings, dependent: :destroy
  has_many :passengers, through: :bookings
  belongs_to :to_airport, class_name: 'Airport', foreign_key: 'origin_id'
  belongs_to :from_airport, class_name: 'Airport', foreign_key: 'destination_id'
end

class Passenger < ApplicationRecord
  has_many :bookings, dependent: :destroy
  has_many :flights, through: :bookings
end

Схема пассажира просто содержит адрес электронной почты и имя для прямо сейчас. Но проблема в том, что я передаю информацию контроллеру «бронирования» Вот моя «Новая» форма для бронирования.

<%= form_for @booking do |f| %>
  <%= f.hidden_field :flight_id, value: params[:booking][:flight_num] %>
  <%= f.hidden_field :passengers_num, value: params[:booking][:passengers_num] %>
  <% params[:booking][:passengers_num].to_i.times do |passenger| %>
    <%= fields_for :passenger  do |passenger| %>
      <%= passenger.label :name, 'Name', class: "Label" %>
      <%= passenger.text_field :name %>
      <%= passenger.label :email, 'email', class: "Label" %>
      <%= passenger.email_field :email %>
    <% end %>
  <% end %>
  <%= f.submit "Book Flight" %>
<% end %>

(Пока игнорируйте скрытые поля, они передаются со страницы поиска «Полеты», и я получаю их просто отлично.)

Итак, я получаю несколько форм (поля имени и адреса электронной почты), но когда я "отправляю", я получаю параметры только для последних наборов полей. (Таким образом, если есть 3 набора полей имени / адреса электронной почты, я получу параметры только для последнего).

Возможно, я не понимаю fields_for, однако, поскольку я не могу найти тонну хороших примеров.

Спасибо!

1 Ответ

0 голосов
/ 04 июля 2018

Может быть много проблем с вашей реализацией ... Я раскрою несколько ...

Переместите <% params[:booking][:passengers_num].to_i.times do |passenger| %> логику в новое действие вашего контроллера заказов ... т.е.

def new
  @booking = Booking.new
  3.times { @booking.passengers.new } # or whatever your logic is to display x amount of passenger fields
end

Убедитесь, что в вашем контроллере бронирований вы разрешаете вложенные атрибуты, подобные этому ...

params.require(:booking).permit(passengers_attributes: [:name, :email])

Что касается формы, вам нужно обращаться с ней как с формой внутри формы (имеет смысл ... вложенные атрибуты, созданные из вложенной формы!) И использовать блочную переменную ... вот так

<ul>
  <%= f.fields_for :passengers do |passenger_form| %>
    <li>
      <%= passenger_form.label :name
      <%= passenger_form.text_field :name %>
    </li>
    <!-- other permitted fields -->
  <% end %>
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...