Ruby 哈希包含单个键的额外值

Ruby Hash is including extra values for a single key

我曾尝试以多种方式构建散列,但是当我在 grouped_options_for_select 标记中使用它时,有一些额外的值不在我的原始散列中。以下是我尝试构建哈希的两种方法:

UNITS_OF_MEASURE_GROUPED = {
  "Dry" =>     ["oz", "lb", "g", "kg"],
  "Liquid" =>  ["floz", "gal", "ml", "L"],
  "Other" =>   ["each"]
}.freeze

还有一点更明确也很罗嗦:

UNITS_OF_MEASURE_GROUPED = {}
UNITS_OF_MEASURE_GROUPED[:dry] = ["oz", "lb", "g", "kg"]
UNITS_OF_MEASURE_GROUPED[:liquid] = ["floz", "gal", "ml", "L"]
UNITS_OF_MEASURE_GROUPED[:other] = ["each"]
UNITS_OF_MEASURE_GROUPED.freeze

但是 grouped_options_for_select 总是在第一部分(“dry”)中包含“floz”和“each”。请参阅附图。

我忘了添加我的表单元素代码:

<%= form.select :unit_of_measure, grouped_options_for_select(UNITS_OF_MEASURE_GROUPED) %>

根据另一条评论中的 Guiseppe,我尝试 <%= form.select :unit_of_measure, UNITS_OF_MEASURE_GROUPED %> 结果相同。

当我在触发错误后进入控制台时,我的 UNITS_OF_MEASURE_GROUPED 散列显示如下:

{:dry=>["oz", "lb", "g", "kg", ["floz", "gal", "ml", "L"], ["each"]], :liquid=>["floz", "gal", "ml", "L"], :other=>["each"]}

我的猜测是这搞砸了 HTML 并变得混乱。有帮助吗?

我错过了什么?提前谢谢你。

问题在于您在 erb 标记内调用 form.select 的方式。 您应该传递一个集合,但您传递的是 string 作为第二个参数。 您应该传递 UNITS_OF_MEASURE_GROUPED 而不是 grouped_options_for_select(UNITS_OF_MEASURE_GROUPED),如下例所示:

<%= form.select :unit_of_measure, UNITS_OF_MEASURE_GROUPED %>.

如果你看 rails guides 你可以找到一个例子。

select helper

Wraps ActionView::Helpers::FormOptionsHelper#select for form builders:

ActionView::Helpers::FormOptionsHelper#select requires a collection 作为参数。

已编辑。

可能是你默认获取的隐藏文件的生成 尝试以下

<%= form.select :unit_of_measure, UNITS_OF_MEASURE_GROUPED, {include_hidden: false} %>

详情见Documentation

我倾向于同意这样一种怀疑,即破坏您的哈希值是罪魁祸首。要找出原因,请尝试更深的冻结:

UNITS_OF_MEASURE_GROUPED = {
  dry: %w(oz lb g kg),
  liquid: %w(floz gal ml L),
  other: %w(each)
}.transform_values(&:freeze).freeze

这将(希望)抛出一个 FrozenError,以及随附的照明堆栈跟踪,从 app/framework 深处的任何地方都在搞砸。