1

2種類のデータでデータベースを作成しようとしています。

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 }

これで、フォーム内に3セットのユニットフィールドが表示されます。それらに記入してフォームを送信すると、その建物の子として保存されます。空白のままにすると、保存されません。:reject_if => lambda { |a| a[:bedrooms].blank? }建物モデルの内部でそれが処理されます。寝室のフィールドが空白のままになっていると、ユニットは保存されません。

必要なのはこれだけです!

これが少し速すぎる場合は、このrailscastをご覧ください。

また、 nested_formsと呼ばれるこの素晴らしいgemをチェックしてください。これは、ネストされたフォームフィールドをその場で追加および削除するためのリンクを提供します(コントローラーの面倒な余分な行を取り除くことができます)。

于 2013-01-14T02:36:32.710 に答える