1

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

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 %>

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

4

1 回答 1

1

您不能在表单中包含表单 - 您必须使用所谓的嵌套属性

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

建造

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? }建筑模型内部负责处理:如果卧室字段留空,则不会保存单元。

这就是你所需要的!

如果这有点太快了,看看这个 railscast

此外,查看这个名为nested_forms的很棒的 gem ,它为您提供了动态添加和删除嵌套表单字段的链接(允许您摆脱控制器中繁琐的额外行)。

于 2013-01-14T02:36:32.710 回答