我已经阅读了许多关于此的帖子,但我仍然感到困惑。我对Rails比较陌生。我在轨道上 3.2.8 和 Ruby 1.9.3。
我有一个表单,我想在其中为 2 个不同的表创建记录。这是一种多对多关系(航海日志可以有多个飞机,飞机将出现在多个航海日志中)。
这是我的代码:
# ----- Models ----- #
class Logbook < ActiveRecord::Base
has_and_belongs_to_many :aircrafts
accepts_nested_attributes_for :aircrafts
end
class Aircraft < ActiveRecord::Base
belongs_to :logbook
end
# ----- Logbooks Controller ----- #
def my_method
@logbook = Logbook.new
@aircraft = Aircraft.new
end
# ----- View ----- #
<%= form_for @logbook, validate: true, remote: true do |f| %>
<%= f.label :flight_date, "Flight Date" %>
<%= f.text_field :flight_date %>
...
<%= f.fields_for :aircrafts, validate: true, remote: true do |a| %>
<%= a.label :aircraft_id, "Aircraft ID" %>
<%= a.text_field :aircraft_id %>
...
<% end %>
<% end %>
日志字段呈现良好,但飞机字段无法呈现。
有什么想法吗?
尝试将控制器更改为:
def my_method
@logbook = Logbook.new
@aircraft = @logbook.aircrafts.build
end
因为@aircraft
需要belongs_to
日志,所以nested_form会知道如何构建表单。
注意:如果您不使用变量@aircraft
则不需要声明它,只需在控制器上使用@logbook.aircrafts.build
没记错的话,fields_for将根据父级存在的许多对象的数量生成。由于您的@logbook没有任何飞机,因此不会显示任何字段。尝试更改操作:
def my_method
@logbook = Logbook.new
@logbook.aircrafts << Aircraft.new
end
现在,如果您需要在 UI 中制作一些内容来添加多个日志,则需要创建一个添加按钮。您可以基于此增加您建立的飞机记录的数量:
<%= form_tag new_logbook_path, :method => :get do %>
<%= hidden_field_tag "amount", @amount %>
<%= submit_tag "Add" %>
<% end %>
然后操作将是:
def my_method
@amount = params[:amount] || 1
@logbook = Logbook.new
@amount.times { @logbook.aircrafts << Aircraft.new }
end