代码之家  ›  专栏  ›  技术社区  ›  msmith1114

轨道:传递嵌套属性参数

  •  0
  • msmith1114  · 技术社区  · 6 年前

    所以我正在完成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 回复  |  直到 6 年前
        1
  •  1
  •   Mark Merritt    6 年前

    <% 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>