首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails:传递嵌套属性参数

Rails:传递嵌套属性参数
EN

Stack Overflow用户
提问于 2018-07-03 21:29:10
回答 1查看 673关注 0票数 0

所以我参与了奥丁项目的“飞行布克”项目。https://www.theodinproject.com/courses/ruby-on-rails/lessons/building-advanced-forms。从本质上讲,这就是它听起来的样子,我在传递嵌套属性时遇到了问题。

首先是相关模式:

代码语言:javascript
复制
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

乘客模式只包含一封电子邮件和现在的名字。但问题是,当我将信息传递给“预订”控制器时。这是我的“新”预订表格。

代码语言:javascript
复制
<%= 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,因为我找不到很多好的例子。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-03 22:30:42

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

<% params[:booking][:passengers_num].to_i.times do |passenger| %>逻辑移动到预订controller...ie的新操作中

代码语言:javascript
复制
def new
  @booking = Booking.new
  3.times { @booking.passengers.new } # or whatever your logic is to display x amount of passenger fields
end

确保在您的预订控制器中允许这样的嵌套属性.

代码语言:javascript
复制
params.require(:booking).permit(passengers_attributes: [:name, :email])

就表单而言,您需要将其视为表单中的表单(使sense...nested属性从嵌套表单中创建!)并使用这个块variable...like

代码语言:javascript
复制
<ul>
  <%= f.fields_for :passengers do |passenger_form| %>
    <li>
      <%= passenger_form.label :name
      <%= passenger_form.text_field :name %>
    </li>
    <!-- other permitted fields -->
  <% end %>
</ul>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51163027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档