arrays - Rails 4.0.5 - 使用包含空字符串的数组处理参数

标签 arrays forms postgresql ruby-on-rails-4 jquery-chosen

自从我切换到 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/

相关文章:

java - 在 Java 中将值从 int 数组的末尾移动到开头

javascript - 当优先使用 'onchange' 事件而不是 'onsubmit' 事件时

php - 搜索表单能够忽略空白字段

html - 从数组中选择表单

php - faker 库和准备好的语句无法正常工作且没有错误显示

javascript - 查找数组项的最长长度 - JS

sql - Postgres Rails 选择不同的顺序

python - 如何在 Python 中为 Postgres 自动生成 UUID?

python - 带有 gevent 的 SQLAlchemy + PostgreSQL 的驱动程序是什么?

java - 如何访问数组中的字段,字段名称存储在变量中?