嵌套的Rails表单字段不呈现

时间:2012-12-11 18:43:28

标签: ruby-on-rails nested-forms

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

日志字段呈现正常,但飞机字段不呈现

有什么想法吗?

2 个答案:

答案 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