我已经阅读了很多关于此的帖子,我仍然感到困惑。我对Rails比较新。我在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 %>
日志字段呈现正常,但飞机字段不呈现。
有什么想法吗?
答案 0 :(得分:1)
尝试将控制器更改为:
def my_method
@logbook = Logbook.new
@aircraft = @logbook.aircrafts.build
end
因为@aircraft
需要belongs_to
一本日志,所以nested_form将知道如何构建表单。
注意:如果您不使用变量@aircraft
,则无需声明它,只需在控制器上使用@logbook.aircrafts.build
答案 1 :(得分:0)
如果我没记错的话,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