Rails 显示页面上的嵌套表单
Rails nested form on show page
我正在尝试在 company#show 页面上使用嵌套表单向公司添加地址。我成功添加了新地址,但是当页面重新加载时,新地址的表单区域填充了现有记录。
我如何才能只显示空的构建记录而不显示现有记录?
这是在表单区域中显示的...
这就是我所期待的...
这是公司#show page...
= form_for @company do |f|
= f.fields_for :addresses do |t|
.form-inline
.col-md-2
= t.text_field :street1, class: 'form-control form-control-sm', placeholder: 'Street 1', id: 'street1'
.col-md-2
= t.text_field :street2, class: 'form-control form-control-sm', placeholder: 'Street 2', id: 'street2'
.col-md-2
= t.text_field :apt_other, class: 'form-control form-control-sm', placeholder: 'Suite #', id: 'apt_other'
.col-md-2
= t.text_field :city, class: 'form-control form-control-sm', placeholder: 'City', id: 'city'
.col-md-1
= t.collection_select :state_id, @states, :id, :state_abbr, {:include_blank => 'State'} , {:class => 'form-control form-control-sm'}
.col-md-2
= t.text_field :zip, class: 'form-control form-control-sm', placeholder: 'Zip', id: 'zip'
.form-inline
.col-md-2
= t.text_field :phone, class: 'form-control form-control-sm', placeholder: 'Phone', id: 'phone'
.col-md-2
= t.text_field :fax, class: 'form-control form-control-sm', placeholder: 'Fax', id: 'fax'
.form-group-row
.text-center
.btn-group{role: 'group'}
= f.submit 'Save', class: 'btn btn-outline-success btn-sm', style: 'margin-bottom: .5em;'
如果你想把它分开,你需要添加一个检查或条件来只显示 fields_for 中的非持久地址,或者你需要在你的控制器中初始化一个新地址并显示一个只为那个表格。例如:
#companies_controller.rb
...
def show
@company = Company.find(params[:id])
@new_address = @company.addresses.build()
end
...
然后你应该创建一个 form_for @new_address
而不是显示 fields_for :addresses
我认为您也可以像这样将 @new_address
直接传递到 fields_for
中:
= f.fields_for :addresses, @new_address do |t|
我还没有测试过这个,你可能需要把它写成一个数组[@new_address]
。这基本上所做的是强制将特定的对象集合用于嵌套 fields_for
。您还可以阅读 docs on fields_for.
我会回答它以关闭线程。
这行是错误的。
= f.fields_for :addresses do |t|
这是我改成的。
= f.fields_for :addresses, Address.new do |t|
我正在尝试在 company#show 页面上使用嵌套表单向公司添加地址。我成功添加了新地址,但是当页面重新加载时,新地址的表单区域填充了现有记录。
我如何才能只显示空的构建记录而不显示现有记录?
这是在表单区域中显示的...
这就是我所期待的...
这是公司#show page...
= form_for @company do |f|
= f.fields_for :addresses do |t|
.form-inline
.col-md-2
= t.text_field :street1, class: 'form-control form-control-sm', placeholder: 'Street 1', id: 'street1'
.col-md-2
= t.text_field :street2, class: 'form-control form-control-sm', placeholder: 'Street 2', id: 'street2'
.col-md-2
= t.text_field :apt_other, class: 'form-control form-control-sm', placeholder: 'Suite #', id: 'apt_other'
.col-md-2
= t.text_field :city, class: 'form-control form-control-sm', placeholder: 'City', id: 'city'
.col-md-1
= t.collection_select :state_id, @states, :id, :state_abbr, {:include_blank => 'State'} , {:class => 'form-control form-control-sm'}
.col-md-2
= t.text_field :zip, class: 'form-control form-control-sm', placeholder: 'Zip', id: 'zip'
.form-inline
.col-md-2
= t.text_field :phone, class: 'form-control form-control-sm', placeholder: 'Phone', id: 'phone'
.col-md-2
= t.text_field :fax, class: 'form-control form-control-sm', placeholder: 'Fax', id: 'fax'
.form-group-row
.text-center
.btn-group{role: 'group'}
= f.submit 'Save', class: 'btn btn-outline-success btn-sm', style: 'margin-bottom: .5em;'
如果你想把它分开,你需要添加一个检查或条件来只显示 fields_for 中的非持久地址,或者你需要在你的控制器中初始化一个新地址并显示一个只为那个表格。例如:
#companies_controller.rb
...
def show
@company = Company.find(params[:id])
@new_address = @company.addresses.build()
end
...
然后你应该创建一个 form_for @new_address
fields_for :addresses
我认为您也可以像这样将 @new_address
直接传递到 fields_for
中:
= f.fields_for :addresses, @new_address do |t|
我还没有测试过这个,你可能需要把它写成一个数组[@new_address]
。这基本上所做的是强制将特定的对象集合用于嵌套 fields_for
。您还可以阅读 docs on fields_for.
我会回答它以关闭线程。
这行是错误的。
= f.fields_for :addresses do |t|
这是我改成的。
= f.fields_for :addresses, Address.new do |t|