Rails和Cocoon。在“编辑表单”

时间:2017-09-25 18:51:50

标签: ruby-on-rails cocoon-gem

我正在以嵌套的形式使用Cocoon,我有一个模型“请求”,可以有许多附件(adjuntos),由Shrine处理。

相同的表单部分用于创建和编辑请求,虽然功能正常,我能够上传文件并成功更新模型,但我显示的信息有问题编辑动作。

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

this input corresponds to a currently attached file to this model

_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是nil:

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

但如果我只是取消注释提升'错误'调试模式,我实际上可以从控制台访问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>

EDIT2。从_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>

2 个答案:

答案 0 :(得分:1)

要实际访问表单正在处理的对象,请使用f.object。因此,例如,如果您想要显示原始文件名,您应该执行<%= f.object.adjunto.original_filename %>之类的操作并相应地设置它(将其包装在标签,范围,提示中?)。

答案 1 :(得分:1)

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