1

我已经阅读了许多关于此的帖子,但我仍然感到困惑。我对 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 %>

日志字段渲染良好,但飞机字段不渲染

有任何想法吗?

4

2 回答 2

2

尝试将控制器更改为:

def my_method
  @logbook = Logbook.new 
  @aircraft = @logbook.aircrafts.build
end

因为@aircraft需要belongs_to一个日志,所以nested_form 会知道如何构建表单。

注意:如果您不使用@aircraft不需要声明的变量,只需@logbook.aircrafts.build在控制器上使用

于 2012-12-11T18:56:19.413 回答
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
于 2012-12-11T18:55:00.523 回答