【发布时间】:2016-08-17 20:17:15
【问题描述】:
我无法确定这是 simple_fields_for 问题、茧问题还是其他问题。如果我在 </div> 展示位置上犯了错误,我看不到它。
当表单首次显示时,它会呈现协议名称的输入字段。用户可以单击按钮来添加感兴趣的表单元素。这工作正常,看起来像这样:
这是用户单击每个“添加元素”按钮后的外观:
用户可以添加 0..many 每个元素。当他们点击“保存”时,一切都很好。
如果其中一个字段出现验证错误,则表单会重新呈现,但有一个异常。 “成像步骤”元素的验证错误根本不会重新显示。当验证失败时,其他元素会重新渲染并按预期突出显示。
这是一个图示示例。用户填写表格的一部分,忘记选择“序列”并且忘记输入“提示描述”的文本:
点击“保存”并验证失败后,表单重新呈现如下:
如您所见,“成像步骤”部分尚未重绘。
如果我在视图的上下文中查看参数,一切似乎都在那里。 @protocol.errors 对我来说也很合适。模型看起来也不错。
这是pastebin of _step_item_fields.html.erb。
这是pastebin of _tip_fields.html.erb。
更新:
如果我像这样构建一个 step_item:
<div id="step_items">
<%= f.simple_fields_for :step_items, @protocol.step_items.build do |si| %>
<%= render 'step_item_fields', :f => si %>
<%end%>
</div>
始终绘制成像步骤部分,但(显然)在验证失败时不会填充。这也混淆了让用户添加/删除 0..many Imaging Steps 的功能。
我也试过了:
<div id="step_items">
<%= f.simple_fields_for :step_items, @protocol.step_items.build(protocol_params) do |si| %>
<%= render 'step_item_fields', :f => si %>
<%end%>
</div>
... 当 protocol_params 可用时的其他变体,但遇到了禁止的参数问题。
更新2:
我还尝试使用参数为 step_item 构建哈希。我可以在这里使用它:
<div id="step_items">
<%= f.simple_fields_for :step_items, @protocol.step_items.build(some_ok_params) do |si| %>
<%= render 'step_item_fields', :f => si %>
<%end%>
</div>
... 但仅适用于单个 step_item。我不确定如何传递反映 0..many 功能的哈希值。此外,以这种方式构建 step_item 可以正确填充表单元素,但不包括错误突出显示样式。这是我开始想知道为什么更简单的解决方案不起作用的时候。
【问题讨论】:
标签: ruby-on-rails forms cocoon-gem