2013-06-30 3 views
1

У меня есть модели, установленные следующим образом:Rails 3 - build_association не работает в fields_for в fields_for

call.rb

belongs_to :contact

contact.rb

has_many :calls 
belongs_to :postal_address, class_name: "Address", foreign_key: "postal_address_id" 
belongs_to :physical_address, class_name: "Address", foreign_key: "physical_address_id" 

адрес.rb

has_many :contacts 

На моих контактных новых/редактирования форм, я использую @contact.build_postal_address и @contact.build_physical_address в ContactsController, которые действуют, как и ожидалось. Представленные представления отображаются с пустыми полями для почтового и физического адреса, если это необходимо.

Когда звонок зарегистрирован, во время разговора возникает форма. Один из вложенных ресурсов в этой форме позволяет оператору редактировать контактные данные с той же страницы, что и ввод другой информации о вызове. Для этой формы, где contact является частью вложенной формы, функции сборки не работают.

Мои формы, используемые в ContactsController являются следующие:

_contact_form.html.erb

<%= simple_form_for @contact do |f| %> 
    <%= f.input :name %> 
    <%= render 'address_fields', f: f, fields: :postal %> 
    <%= render 'address_fields', f: f, fields: :physical %> 
    <%= f.submit %> 
<% end %> 

_address_fields.html.erb

<%= f.simple_fields_for fields do |a| %> 
    <%= a.input :address_line_1 %> 
<% end %> 

Мои формы, используемые в CallsController являются следующими (повторное использование _address_fields парциальное :)

_call_form.html.erb

<%= simple_nested_form_for @call do |f| %> 
    <%= f.input :call_comments %> 
    <%= f.simple_fields_for :contact do |contact| %> 
    <%= contact.input :name %> 
    <%= render 'address_fields', f: contact, fields: :postal %> 
    <%= render 'address_fields', f: contact, fields: :physical %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

Независимо от того, что я делаю с @contact.build_physical_address или @contact.build_postal_address в контроллере, почтовые и физические поля адреса не появляются в форме вызова, если только адрес уже существует под контактом. Если адрес уже существует, вызов действия build_* на почтовом/физическом уровне также не очищает поля.

ответ

1

Оказывается, это была проблема с тем, как я вызывал simple_fields_for в форме вызова.

В контроллере вызовов, я должен был установить следующее:

calls_controller.rb

@contact = params[:contact_id] 
@contact.build_postal_address if @contact.postal_address == nil 
@contact.build_physical_address if @contact.physical_address == nil  
@call = Call.new(contact_id: @contact.id) 

В моей форме вызова, я тогда нужно ammend в fields_for линию для контакта, чтобы быть:

_call_form.html.ERB

... 
<%= f.simple_fields_for :contact, @contact do |contact| %> 
... 

Это вызвало @contact объект, который будет использоваться для fields_for значений, вместо того, чтобы объект @ call.contact, которые не пострадали от build_* методов в контроллере.

Смежные вопросы