假设我有一个如下表格
<%= form_for @uni, :html => {:multipart => true, :honeypot => true} do |uni_form| %>
<% 3.times { @uni.app.build } %>
<%= uni_form.fields_for :apps do |builder| %>
<%= render 'app', uni_form: builder %>
<% end %>
<% end %>
我的app部分是
<div>
<%= uni_form.label :uni_id, "University" %>
<%= uni_form.collection_select :uni_id, @unis, :id, :name, {:include_blank => true} %>
</div>
现在我想要没有循环的第一个表单代码。像这样的东西
<%= form_for @uni, :html => {:multipart => true, :honeypot => true} do |uni_form| %>
<% 3.times { @uni.app.build } %>
<%= render 'app', uni_form: builder %>
<%= render 'app', uni_form: builder %>
<%= render 'app', uni_form: builder %>
<% end %>
我该怎么做?
答案 0 :(得分:1)
首先,不要在视图中构建关联对象 - 在控制器中执行:
#app/controllers/unis_controller.rb
class UnisConstroller < ApplicationController
def new
@uni = Uni.new
3.times do
@uni.apps.build
end
end
end
其次,fields_for
方法是你的朋友。
使用以下内容即可获得所需内容:
#app/views/unis/new.html.erb
<%= form_for @uni, :html => {:multipart => true, :honeypot => true} do |uni_form| %>
<%= uni_form.fields_for :apps do |builder| %>
<%= builder.label :uni_id, "University" %>
<%= builder.collection_select :uni_id, @unis, :id, :name, {:include_blank => true} %>
<% end %>
<% end %>
fields_for
获取模型的关联对象并自动创建所需的字段。实际上没有必要“循环” - fields_for
为你做了... 如果你正确设置它。
您遇到的问题是您在运行时构建关联对象,这不仅效率低下而且效率低下。违反惯例,但我认为它会阻止form_for
识别它们(这是允许fields_for
循环它们的原因。)
以上代码应该为您解决此问题。