Rails:传递嵌套属性参数

时间:2018-07-03 21:29:10

标签: ruby-on-rails

因此,我正在Odin项目的“ Flight Booker”项目中工作。 http://hyperledger-fabric.readthedocs.io/en/release-1.1/peers/peers.html#peers-and-orderers。从本质上讲,这听起来很像,而且我在传递嵌套属性时遇到了问题。

首先是相关模型:

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 :(得分:1)

您的实现可能有很多问题...我会布局一些...

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