ROR-尝试使用嵌套表单创建对象

问题描述 投票:0回答:1

我正在尝试在预订/新视图中使用嵌套表单创建对象。我有一个飞行模型,一个预订模型和一个乘客模型。飞行模型has_many :passengershas_many :bookings预订模型belongs_to :flighthas_many :passengers乘客模型“属于:预订and属于:飞往”

这是我的视图bookings / new.html.erb:

<h1>Create new booking</h1>

For flight <%= @flight.id %>: <%= @flight.departure_airport.code %> - <%= @flight.arrival_airport.code %>
on: <%= @flight.departure_date %><br><br>

<%= form_with model: @booking, local: true do |f| %>
  <%= f.hidden_field :flight_id, value: @flight.id %>

    <%= f.fields_for :passengers do |passenger| %>
      <%= passenger.hidden_field :flight_id, value: @flight.id %>
      <%= passenger.label :name %><br>
      <%= passenger.text_field :name %><br>
      <%= passenger.label :email %><br>
      <%= passenger.email_field :email %><br><br>
    <% end %>

  <%= f.submit %>
<% end %>

这里是我的预订管理员:

class BookingsController < ApplicationController
  def new
    @flight = Flight.find(params[:flight_id])
    @num_of_pass = params[:num_of_pass].to_i
    @booking = Booking.new
    @num_of_pass.times do
      @booking.passengers.build
    end
  end

  def create
    @flight = Flight.find(params[:booking][:flight_id])
    @booking = @flight.bookings.build(booking_params)
    if @booking.save
      puts "SAVED"
    else
      puts @booking.errors.full_messages
      puts "NOT SAVED"
    end

  end

  def show
    @booking = Booking.find(params[:id])
  end

  private
    def booking_params
      params.require(:booking).permit(:flight_id, passengers_attributes:[:name, :email, :flight_id])
    end 
end

我得到的错误是“预订的乘客不能为空”如果我生成预订,然后保存它,然后生成乘客,则可以正常工作,但是我正在尝试使用嵌套的强大参数。

问题似乎是在创建乘客之前未保存预订模型。

我一直为此奋斗好几个小时,希望有人能给我一些见识

谢谢

ruby-on-rails-5
1个回答
0
投票

我的问题是我的乘客模型已经过验证。因为我有validates :booking_id, presence: true

,所以无法构建

有人知道如何保留验证,但也允许其建立吗?

© www.soinside.com 2019 - 2024. All rights reserved.