Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:传递嵌套属性参数_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails:传递嵌套属性参数

Ruby on rails Rails:传递嵌套属性参数,ruby-on-rails,Ruby On Rails,因此,我正在进行奥丁项目的“航班预订”项目。这本质上就是它听起来的样子,我遇到了传递嵌套属性的问题 首先是相关模型: class Booking < ApplicationRecord belongs_to :passenger belongs_to :flight accepts_nested_attributes_for :passenger end class Flight < ApplicationRecord has_many :bookings, dep

因此,我正在进行奥丁项目的“航班预订”项目。这本质上就是它听起来的样子,我遇到了传递嵌套属性的问题

首先是相关模型:

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

(暂时忽略隐藏字段,它们是从“Flights”搜索页面传递过来的,我可以很好地得到它们。)

因此,我得到多个表单(姓名和电子邮件字段),但当我“提交”时,我只得到最后一个字段集的参数。(因此,如果有3组名称/电子邮件字段,我只获取最后一组的参数)

我可能不理解
字段,但是我找不到很多好的例子


谢谢

您的实现可能会有很多问题……我会安排一些

逻辑移到您的预订控制器的新操作中…即

def new
  @booking = Booking.new
  3.times { @booking.passengers.new } # or whatever your logic is to display x amount of passenger fields
end
确保在您的bookings控制器中允许这样的嵌套属性

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>

  • 我对
    3.times{@book.patiences.new}感到困惑
    我不明白这是怎么回事?侧注:如何将多个乘客属性传递到控制台中的新预订创建中?新操作旨在在创建对象之前实例化对象。因此,如果您有嵌套属性,则需要在从表单创建属性之前实例化它们(所有属性)。为了使用控制台分配嵌套属性,您需要使用散列数组…即…乘客属性:[{name:“something”,email:something@exmaple.com},{姓名:“其他”,电子邮件:somethingelse@example.com"}]幸运的是,由于以前的表单,我提前知道了数字。我也尝试在控制台中完全这样做,但由于某些原因,它无法工作。您是否在乘客属性(即电子邮件)中的第一个哈希之后添加了一个“结尾”:something@exmaple.com“…我的错”?我测试了它,它正在工作。如果这不起作用,发布您收到的错误消息,我们可以从那里开始。