【发布时间】:2012-02-14 07:11:21
【问题描述】:
我正在使用 Rails 3.2.0.rc2。我有一个Model,其中我有一个静态Array,我通过一个表单提供,这样用户可以选择Array 的一个子集并将他们的选择保存到数据库中,存储在单个Model 中的列。我在存储Array 的数据库列上使用了序列化,Rails 正确地将用户的选择转换为 Yaml(并在读取该列时返回数组)。我正在使用多选表单输入进行选择。
我的问题是,按照我目前的方式,一切正常,除了用户的子集数组在发送到服务器时总是有一个空白的第一个元素。
这没什么大不了的,我可以在事后编写代码来消除它,但我觉得我只是在犯某种语法错误,因为在我看来,默认的 Rails行为会无缘无故地故意添加这个空白元素。我一定错过了什么或忘记禁用某种设置。请帮助我了解我所缺少的内容(或向我指出一些很好的文档,这些文档比我在 intertubes 上找到的内容更深入地描述了这一点)。
MySQL 数据库表“模型”:
- 包括一个名为
subset_array的列,它是一个 TEXT 字段
类模型包括以下设置:
serialize :subset_arrayALL_POSSIBLE_VALUES = [value1, value2, value3, ...]
模型编辑表单包含以下输入选项:
f.select :subset_array, Model::ALL_POSSIBLE_VALUES, {}, :multiple => true, :selected => @model.subset_array
PUT 从客户端到服务器看起来像这样:
- 假设只选择了 value1 和 value3
"model" => { "subset_array" => ["", value1, value3] }
数据库更新如下:
UPDATE 'models' SET 'subset_array' = '--- \n- \"\"\n- value1\n- value3\n'
如您所见,数组中有这个额外的空白元素被发送并设置在数据库中。我该如何摆脱它?我的f.select 调用中是否缺少某个参数?
非常感谢 :)
EDIT:这是从f.select 语句生成的HTML 代码。看起来好像正在生成一个隐藏的输入,这可能是我的问题的原因?为什么会在那里?
<input name="model[subset_array][]" type="hidden" value>
<select id="model_subset_array" multiple="multiple" name="model[subset_array][]" selected="selected">
<option value="value1" selected="selected">Value1</option>
<option value="value2">Value2</option>
<option value="value3" selected="selected">Value3</option>
<option...>...</option>
</select>
【问题讨论】:
-
您能发布
f.select生成的HTML sn-p 吗?此外,这种行为是在创建时发生还是仅在更新时发生? -
添加了从
f.select生成的输出HTML标记的编辑 -
@mike-a 确认创建和更新的行为相同
-
我想知道我使用的浏览器是否可能是问题的一部分:它如何解释和表达与选择标签同名的隐藏输入标签的含义。所以我在 Chrome、Safari、Firefox 和 Opera 中尝试了我的应用程序,每个都产生了相同的结果。
-
请注意,所有使用
include_hidden: false的解决方案都带有一个陷阱。当您从选择框中删除所有值时,惯用的model.update(something_params)将不包含该字段。 TL;DR,您将无法将该字段设为空。
标签: html ruby-on-rails forms serialization multi-select