Rails 4为没有循环的嵌套属性渲染部分

时间:2015-11-12 15:58:41

标签: ruby-on-rails ruby-on-rails-4

假设我有一个如下表格

<%= 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 %>

我该怎么做?

1 个答案:

答案 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循环它们的原因。)

以上代码应该为您解决此问题。