所以我参与了奥丁项目的“飞行布克”项目。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,因为我找不到很多好的例子。
谢谢!
发布于 2018-07-03 22:30:42
你的实现可能有很多问题.我会安排一些.
将<% params[:booking][:passengers_num].to_i.times do |passenger| %>逻辑移动到预订controller...ie的新操作中
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])就表单而言,您需要将其视为表单中的表单(使sense...nested属性从嵌套表单中创建!)并使用这个块variable...like
<ul>
<%= f.fields_for :passengers do |passenger_form| %>
<li>
<%= passenger_form.label :name
<%= passenger_form.text_field :name %>
</li>
<!-- other permitted fields -->
<% end %>
</ul>https://stackoverflow.com/questions/51163027
复制相似问题