我正在以嵌套的形式使用Cocoon,我有一个模型“请求”,可以有许多附件(adjuntos),由Shrine处理。
相同的表单部分用于创建和编辑请求,虽然功能正常,我能够上传文件并成功更新模型,但我显示的信息有问题编辑动作。
问题是它正在为每个当前附加到Request的文件呈现一个输入,我可以通过选择一个新的或删除它来编辑附件,但是我无法显示文件的名称对应于这些输入中的每一个,因此用户将无法知道哪些附件正在编辑。显然我不能使用_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是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>
答案 0 :(得分:1)
要实际访问表单正在处理的对象,请使用f.object
。因此,例如,如果您想要显示原始文件名,您应该执行<%= f.object.adjunto.original_filename %>
之类的操作并相应地设置它(将其包装在标签,范围,提示中?)。
答案 1 :(得分:1)
我不是100%确定对象是如何从fields_for
循环传递到局部的,但你应该能够使用ajunto.object
访问部分之外的adjunto对象,所以在渲染部分(但仍在_form.html.erb
循环内)后,您可以在fields_for
中添加一行以显示文件名。