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
中添加一行以显示文件名。
我在嵌套形式中使用 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
中添加一行以显示文件名。