自从我切换到 Rails 4.0.5 后,使用 postgresql 字符串数组的模型的表单开始出现一些不良行为。
def up
add_column :cuts, :states, :text, :array => true
end
表单使用 collection_select
<%=
f.collection_select(
:states,
states,
:last,
:first,
{},
:multiple => true,
:class => 'chosen chosen_allow_deselect'
)
%>
我试过强制 :include_blank => false
同样,但无论如何,如果我在不选择任何州的情况下提交表格,params[:cut][:states]
评估为 [""]
,最终被写入数据库。现在我的states
字段本应为空白。
显然我可以写一个 before_validation
回调或 attribute_normalizer
清理数组,但我希望有一些方法可以关闭此“功能”并防止 Rails 以这种方式解释表单输入。
请注意,HABTM 关系的多选也会发送一个带有空白字符串的数组,但 Rails 知道如何处理它并且不会尝试为空白值分配记录。当字段是实际数组时,这似乎只会产生真正的问题。
更新
具体来说,我希望有一个我不知道的表单助手选项,它可以很好地防止在未选择任何内容且没有空白时提交空白 <option>
标签。我们的服务器目前使用的是4.0.2,服务器上根本不会出现这个问题。我在本地执行的应用程序代码与在服务器上运行的代码相同。这就是我得出的结论,即新版本的 Rails 正在做一些不同的事情。
更新
再次查看 html 后,我认为它选择了使用它创建的隐藏输入之一来执行此操作;它添加了这样的输入:
<input name="cut[states][]" type="hidden" value="">
这让我相信它一直在这样做,并且行为的变化是在 ActiveRecord 中而不是表单提交问题。
最佳答案
你说的“without selecting any states”是指你在select中选择了blank选项吗?如果是这样,那么有时候这是一个有效的选择,如果你做了一些全面的“将所有空字符串变成 nil”的解决方案,那很可能最终会在其他地方咬你的屁股。
如果您不想将空字符串保存到“states”字段(改为保存 nil),那么您可以覆盖 setter 方法。
#in Cut model
def states=(string)
if string.blank?
self[:states] = nil
else
self[:states] = string
end
end
关于arrays - Rails 4.0.5 - 使用包含空字符串的数组处理参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25139661/