Rails 和茧。在编辑表单中访问子模型的值

Rails and Cocoon. Accessing values from child model in Edit Form

我在嵌套形式中使用 Cocoon,其中我有一个模型“Request”,它可以有许多附件(adjuntos),由 Shrine 处理。

创建和编辑请求都使用了相同的部分表单,虽然功能运行良好并且我能够上传文件并成功更新模型,但我对显示的信息有疑问对于编辑操作。

问题是,它正在按预期为当前附加到请求的每个文件呈现一个输入,我可以通过选择一个新附件或删除它来编辑附件,但我无法显示名称与这些输入中的每一个对应的文件,因此用户将无法知道正在编辑哪个附件。显然我不能使用 _adjunto_fields.html.erb 中的对象 'f' 来访问子模型的值。

_form.html.erb

<%= form_for @request do |f| %> 
<%= render 'shared/errors', object: @request %>
  <div>
    <%= f.label :ot %>
    <%= f.text_field :ot%>
  </div>
  <div>
    <%= f.label :area %>
    <%= f.text_field :area%>
  </div>
  <div>
    <%= f.label :titulo %>
    <%= f.text_field :titulo%>
  </div>
  <div>
    <%= f.label :observaciones %>
    <%= f.text_field :observaciones%>
  </div>
  <div>
    <%= f.label :prioridad %>
    <%= f.text_field :prioridad%>
  </div>

  <div id="adjuntos">
    <%= f.fields_for :adjuntos do |adjunto| %>
    <%= render 'adjunto_fields', f: adjunto %>
  <%end%>

  <div class="links">
    <%= link_to_add_association 'añadir adjunto', f , :adjuntos %>
  </div>
  </div>

  <%= f.submit %>
  <%end%>

_adjuntos_fields.html.erb

 <div class="nested-fields">
   <%= f.label :adjunto %>
   <%= f.file_field :adjunto%>

   <%= f.check_box :_destroy%>

   <%= link_to_remove_association "quitar adjunto", f %>
 </div>

编辑:尝试访问表单中的 f.object 时出现错误,因为 f.object 为零:

<div class="nested-fields">
  <%= f.label :adjunto %>
  <%= f.file_field :adjunto%>
  <%#<%raise 'foo'%>
  <% parsed_data = JSON.parse f.object.adjunto_data %>
  <%= parsed_data["metadata"]["filename"]%>

  <%= f.check_box :_destroy%>

  <%= link_to_remove_association "quitar adjunto", f %>
</div>

>> f.object => #<Adjunto id: nil, title: nil, adjunto_data: nil, created_at: nil, updated_at: nil, request_id: 1>

但是如果我只是取消注释 raise 'error' 调试模式我实际上可以从控制台访问 f.object:

>> f.object => #<Adjunto id: 4, title: nil, adjunto_data: "{\"id\":\"4cbf9b5477c586779069a5144cd67104.PNG\",\"stor...", created_at: "2017-09-26 20:49:47", updated_at: "2017-09-26 20:49:47", request_id: 1>

编辑2。从 _adjunto_fields 表单外部调用对象有效:

<div id="adjuntos">
  <%= f.fields_for :adjuntos do |adjunto| %>
    <%= render 'adjunto_fields', f: adjunto %>
    <% parsed_data = JSON.parse adjunto.object.adjunto_data %>
    <%=parsed_data["metadata"]["filename"]%>
  <%end%>

  <div class="links">
    <%= link_to_add_association 'añadir adjunto', f , :adjuntos %>
  </div>

</div>

要真正到达表单正在处理的对象,请使用 f.object。因此,例如,如果您想显示原始文件名,您应该执行类似 <%= f.object.adjunto.original_filename %> 的操作并相应地设置样式(将其包装在标签、跨度、提示中?)。

我不是 100% 确定对象是如何从 fields_for 循环传递到部分的,但是您应该能够使用 ajunto.object 访问部分之外的附属对象,因此您可以在呈现部分(但仍在 fields_for 循环内)后在 _form.html.erb 中添加一行以显示文件名。