Rails 4 - 键值对

时间:2016-04-13 00:15:21

标签: ruby-on-rails enums

我试图在Rails 4中创建一个应用程序。

我最近问了这两个问题,并在回复中提出了建议。 Rails 4 - how to use enum?

我还在苦苦挣扎。

我有一个带有输入选择器的表单:

<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governances.to_a.map { |p| [p.to_s.humanize, p] } %>

当我保存并尝试时,选择菜单显示:

[&#34; tier_1&#34;,1]

我想要的是显示:第1层

目前,我有一个偏好模型:

enum self_governance: {
                          tier_1: 1,
                          tier_2: 2,
                          tier_3: 3,
                          tier_4: 4,
                          tier_5: 5
                        }

  enum autonomy: {
                          tier_11: 1,
                          tier_21: 2,
                          tier_31: 3,
                          tier_41: 4,
                          tier_51: 5
                        }           

我有偏好显示视图:

<%= @organisation.preference.self_governance.try(:humanize) %>

此外,当我接受表单问题(暂时)并尝试呈现显示页面时,我收到此错误:

'["tier_1", 1]' is not a valid self_governance

任何人都可以看到我做错了吗?

我只想在数据库中保存数字1,但显示单词&#39;第1层&#39;。

1 个答案:

答案 0 :(得分:1)

更新您的表单,以便从您的枚举中正确返回一组键和值。 Preference.self_governances是一种哈希对象.r而不是调用to_a,只是迭代键和值:

<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governances.map { |key, val| [key.humanize, key] } } %>

如果我们只查看输出: Preference.self_governances.map { |key, val| [key.humanize, key] }

我们得到以下信息:

[
  ["Tier 1", "tier_1"], 
  ["Tier 2", "tier_2"]
  ...
]

请注意,第一个值显示为select标签,第二个值是param内发送给控制器的值。

修改

使用枚举时,您可以将枚举的键或值分配给字段。

preference.self_governance = 1 # Works
preference.self_governance = :tier_1  # Works
preference.self_governance = "tier_1" # Works

但您无法将该值指定为字符串:

preference.self_governance = '1'
=> "ArgumentError: '1' is not a valid self_governance"  # Doesn't work, tries to look for key '1' in enum, but doesn't exist.

因此,请务必将所选枚举的密钥(即&#34; tier_1&#34;)传递给您的表单,否则您就可以了