在Rails的嵌套表单中, 如果在model的accepts_nested_attributes_for后加入了:allow_destroy => true ,就可一通过在表单中提交一个_destroy,来控制是否删除嵌套属性。(嵌套表单)
问题出现在这样一个场景:
1、用户在编辑一个相册,删除了一些照片(并没有真正的删除,只是把_destroy隐藏域设置为true,并且隐藏了这些照片。如果此时提交,那么这些照片将被真正删除),但是,没有保存,而是点击了取消。
2、然后他点击浏览器“后退”按钮,又返回到编辑页面,浏览器缓存会让页面看起来和用户取消编辑前一样。有些照片被隐藏了。
3、刷新页面,那些被隐藏的照片又回来了。用户修改了一下相册的描述。保存。
4、然后发现,在步骤1中删除的那些照片被删掉了。
1、用户在编辑一个相册,删除了一些照片(并没有真正的删除,只是把_destroy隐藏域设置为true,并且隐藏了这些照片。如果此时提交,那么这些照片将被真正删除),但是,没有保存,而是点击了取消。
2、然后他点击浏览器“后退”按钮,又返回到编辑页面,浏览器缓存会让页面看起来和用户取消编辑前一样。有些照片被隐藏了。
3、刷新页面,那些被隐藏的照片又回来了。用户修改了一下相册的描述。保存。
4、然后发现,在步骤1中删除的那些照片被删掉了。
原来,这是浏览器的自动填充功能(autocomplete)搞得鬼。在步骤1的时候浏览器记住了每个_destroy的值,又在步骤3中帮你填好了。
解决办法:
<%= f.hidden_field :_destroy, :autocomplete => 'off' %>
autocomplete这个属性,之前并不是HTML标准,只是浏览器都支持。直到HTML5才成为标准。它对所有的表单域都有效。