我正在尝试使用两种类型的数据创建数据库。
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 %>
但据我所知,这只会创建新建筑物,而不是与它们相关的单位。
答案 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的精彩宝石,它会为您提供动态添加和删除嵌套表单字段的链接(允许您摆脱控制器中那些繁琐的额外行)。