用于在rails中添加两个数据库条目的表单

时间:2013-01-14 00:00:36

标签: ruby-on-rails

我正在尝试使用两种类型的数据创建数据库。

1)具有各自属性的公寓楼(例如地址) 2)具有各自属性的单位(属于建筑物)(例如,价格,大小)

我想知道我是否可以拥有一个包含两个数据库表单的页面?

实施例。用于创建新建筑的表单,并直接在页面上添加新单元信息。

<%= form_for(@building) do |f| %>

  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.label :address %>
  <%= f.text_field :address %>

  <%= f.label :contact %>
  <%= f.email_field :contact %>
  <br>
      <%= form_for(@unit) do |f| %>

  <%= f.label :bedrooms %>
  <%= f.text_field :bedrooms %>

  <%= f.label :price %>
  <%= f.text_field :price %>

  <%= f.label :building_id %>
  <%= f.text_field :building_id %>
  <br>
  <%= f.submit "Create building", class: "btn btn-large btn-primary" %>
<% end %>   
<% end %>

但据我所知,这只会创建新建筑物,而不是与它们相关的单位。

1 个答案:

答案 0 :(得分:1)

您不能在表单中包含表单 - 您必须使用名为nested attributes的表单。

我认为建筑物有很多单元,一个单元属于建筑物。那么你的代码需要如下:

建筑

class Building < ActiveRecord::Base
  attr_accessible :units_attributes
  has_many :units, :dependent => :destroy
  accepts_nested_attributes_for :units, :reject_if => lambda { |a| a[:bedrooms].blank? }, :allow_destroy => true
end

单元

class Unit < ActiveRecord::Base
  belongs_to :building
end

表格

注意fields_for表单助手(非常自解释): 将以下内容放在表单中:

<%= f.fields_for :units do |builder| %>
  <%= builder.label :bedrooms %>
  <%= builder.text_field :bedrooms %>
  # etc
<% end %>

当您重新加载页面时,您会看到您的表单可能尚未包含任何单位字段。这是因为表单中的构建实例还没有任何单元 - 在控制器中执行以下操作以查看单元字段:

3.times { @building.units.build }

现在您应该在表单中看到三组单位字段。如果你填写并提交表格,他们将被保存为该建筑的孩子 - 如果你把它们留空,他们就不会。建筑模型中的:reject_if => lambda { |a| a[:bedrooms].blank? }负责:如果卧室字段留空,则不会保存单位。

这就是你所需要的!

如果这有点太快,请注意this railscast

另外,请查看这个名为nested_forms的精彩宝石,它会为您提供动态添加和删除嵌套表单字段的链接(允许您摆脱控制器中那些繁琐的额外行)。