我的模型设置如下:
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"
address.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_*
操作也不会清除字段。
答案 0 :(得分: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)
在我的电话表格中,我需要修改fields_for
联系电话:
<强> _call_form.html.erb 强>
...
<%= f.simple_fields_for :contact, @contact do |contact| %>
...
这导致@contact
对象用于fields_for
值,而不是@ call.contact对象,该对象未受控制器中build_*
方法的影响。