Rails 3 Вложенные формы
У меня есть модель Person и модель адреса:
class Person < ActiveRecord::Base
has_one :address
accepts_nested_attributes_for :address
end
class Address < ActiveRecord::Base
belongs_to :person
end
В моем контроллере у меня есть @person.build_address
в моем новом действии. Мои формы строятся правильно. Проблема заключается в том, что при отправке формы создается запись человека и запись адреса, но они не связаны через столбец address_id в таблице Person.
Мне не хватает шага в контроллере?
Спасибо!
Новое действие
UPDATE
def new
@person = Person.new
@person.build_address
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @person }
end
end
Код формы
UPDATE
<%= form_for(@person) do |f| %>
<% if @person.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@person.errors.count, "error") %> prohibited this person from being saved:</h2>
<ul>
<% @person.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :first_name %><br />
<%= f.text_field :first_name %>
</div>
<div class="field">
<%= f.label :last_name %><br />
<%= f.text_field :last_name %>
</div>
<div class="field">
<%= f.label :email %><br />
<%= f.text_field :email %>
</div>
<div class="field">
<%= f.label :telephone %><br />
<%= f.text_field :telephone %>
</div>
<div class="field">
<%= f.label :mobile_phone %><br />
<%= f.text_field :mobile_phone %>
</div>
<div class="field">
<%= f.label :date_of_birth %><br />
<%= f.date_select :date_of_birth %>
</div>
<div class="field">
<%= f.label :gender %><br />
<%= f.select(:gender, Person::GENDER_TYPES) %>
</div>
<div class="field">
<%= f.label :notes %><br />
<%= f.text_area :notes %>
</div>
<div class="field">
<%= f.label :person_type %><br />
<%= f.select(:person_type, Person::PERSON_TYPES) %>
</div>
<%= f.fields_for :address do |address_fields| %>
<div class="field">
<%= address_fields.label :street_1 %><br />
<%= address_fields.text_field :street_1 %>
</div>
<div class="field">
<%= address_fields.label :street_2 %><br />
<%= address_fields.text_field :street_2 %>
</div>
<div class="field">
<%= address_fields.label :city %><br />
<%= address_fields.text_field :city %>
</div>
<div class="field">
<%= address_fields.label :state %><br />
<%= address_fields.select(:state, Address::STATES) %>
</div>
<div class="field">
<%= address_fields.label :zip_code %><br />
<%= address_fields.text_field :zip_code %>
</div>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Ответы
Ответ 1
Для этого вам нужно иметь accepts_nested_attributes_for :address
для вашей модели Person
. В вашем действии create
вы можете сделать следующее:
def create
@person = Person.new(params[:person])
...
end
Тогда Rails позаботится обо всех остальных.
UPDATE: если столбец address_id
находится в таблице people
, тогда он должен быть belongs_to :address
, а не has_one :address
Ответ 2
Почему ваш адрес создан в новом действии, а не в действии create? Вы создаете адрес из не сохраненной модели без идентификатора, поэтому внешний ключ не может быть установлен. Вы должны сохранить свой @person в своем новом действии, но поместите свой файл build_address в свое действие create, после сохранения @person.