Rails、fields_for 为尽可能多的附件(甚至 0 个)生成字段,而我想要 only/at 最少一个

Rails, fields_for generate fields for as many attachments (even 0), while I want only/at least one

我有区域并且每个区域都有多个图像通过area_attachments.

我有一个模式可以编辑每个区域。

我也想在每个区域编辑area_attachments所以我有一个f.fields_for在每个区域表格中。

<%first_rendered=false %>
<%= f.fields_for :area_attachments do |aa| %>
  <%unless first_rendered %>
  <div class="field">
   <br>
   <%= aa.file_field :image, :multiple => true, name: "area_attachments[image][]" %>
  </div>
  <% first_rendered=true %>
  <% end %>
<% end %>

因为是多张上传,所以我只想要一个字段,这样用户就可以将更多图片上传到区域

如你所见,我有一个 first_rendered 变量,所以如果 area 有多个 area_attachments字段只会显示一次,没有理由多字段。

但是如果一个区域根本没有area_attachments,那么该字段根本不会显示。

你建议我在这里做什么?另外,你会做一些别的事情来代替我使用的这个 first_rendered 变量吗? 一般来说,你会怎么做才能只生成一个字段?

如果您不希望遍历集合的默认行为,请不要使用 fields_for

如果您将输入命名为 area_attachment_attributes[1][image][],那么它仍应使用 accepts_nested_attributes 来根据需要构建新的 AreaAttachment 对象。输入名称中的 1 在您的情况下并不重要,因为您只想允许构建一个对象,否则它将用于分离出用于构建每个对象的参数。

实际上,我没有使用问题中的代码,而是使用了以下代码。

<%= f.fields_for :area_attachments, @area.area_attachments.build do |aa| %>              
  <div class="field">
   <br>
   <%= aa.file_field :image, :multiple => true, name: "area_attachments[image][]" %>
  </div>                          
<% end %>

而且效果很好。 first_render 东西甚至都不是必需的。