Rails 4 - 如何使用枚举?

时间:2016-04-11 22:53:20

标签: ruby-on-rails enums

我正在尝试在Rails 4上制作应用程序。

我发布了这个问题并得到了一些建议:Rails 4 -Simple Form how to save key and display value

我正在试图弄清楚如何实施这个建议。

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

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
                        }           

在我的偏好形式中,我有:

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

我有偏好显示视图:

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

当我保存所有这些并尝试时,我收到此错误:

NoMethodError at /preferences/1/edit
undefined method `self_governance' for #<Class:0x007fde5b9fb500>
Did you mean?  self_governances

任何人都可以看到如何使这项工作?

我是否可能需要在首选模型中为枚举添加def / end标签?我没有使用代码'enum'的经验

2 个答案:

答案 0 :(得分:1)

你真是太近了:)错误修正是正确的。

您的选择正在调用

Preference.self_governance.to_a.map { |p| [p.humanize, p] }

你的错误告诉你复数是错误的。请记住,如果您在单个对象上调用枚举,则它将是

@preference.self_governance

但是如果你打电话给模特本身,Preference,并要求收集它的复数。

Preference.self_governances

因为enum很特别,所以你的枚举可能只是数组,而不是哈希:

enum self_governance: [ tier_1, tier_2, tier_3, tier_4, tier_55 ]

enum autonomy: [ tier_11, tier_21, tier_31, tier_41, tier_51 ]

您的观点如下:

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

它将存储数组的索引号,如magic:)

答案 1 :(得分:0)

Rails为您复制枚举集合,例如,您可以self_governances

这意味着Preference.self_governances将返回带有定义的哈希值,实际保存该值的属性是单数形式,如@preference.self_governance

一个例子:

@preference = Preference.new
@preference.self_governance = Preference.self_governances[:tier_1]

当您使用enum内部轨道将执行的操作时,添加一个复数类方法定义,其中包含您定义的名称,该名称将返回带有值的哈希值,并将使用您定义的名称,因为它是您编写的属性访问器,它将获取/设置对象实例上枚举的实际值。

另一个常见用途是状态,给定Test类:

enum status: {
  active: 1,
  inactive: 2
}

因此,对于上面的示例rails,会添加Test.statuses方法,只返回枚举值。然后,对于Test对象的实例,您将拥有一个具有名称名称的访问者@instance.status,您可以使用该名称从Test.statuses <返回的哈希值中获取或设置状态/ p>

希望这是有道理的。