假设我有一个如下所示的表单
<%= 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 %>我的应用程序部分是
<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 %>我该怎么做呢?
发布于 2015-11-13 19:14:33
首先,不要在视图中构建关联的对象-在控制器中构建
#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循环访问它们的原因)。
上面的代码应该会帮你解决这个问题。
https://stackoverflow.com/questions/33675774
复制相似问题