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 东西甚至都不是必需的。
我有区域并且每个区域都有多个图像通过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 东西甚至都不是必需的。